gpustack-runtime 0.2.2__tar.gz → 0.2.2.post1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/PKG-INFO +1 -1
  2. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/_version.py +2 -2
  3. gpustack_runtime-0.2.2.post1/gpustack_runtime/_version_appendix.py +1 -0
  4. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/deployer/__types__.py +9 -0
  5. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/deployer/kuberentes.py +25 -35
  6. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/deployer/test_workload_status.py +38 -0
  7. gpustack_runtime-0.2.2/gpustack_runtime/_version_appendix.py +0 -1
  8. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/.codespelldict +0 -0
  9. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/.codespellrc +0 -0
  10. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/.dockerignore +0 -0
  11. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/.gitattributes +0 -0
  12. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/.gitignore +0 -0
  13. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/.pre-commit-config.yaml +0 -0
  14. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/.python-version +0 -0
  15. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/LICENSE +0 -0
  16. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/Makefile +0 -0
  17. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/README.md +0 -0
  18. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/deploy/manifests/docker-compose.yaml +0 -0
  19. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/deploy/manifests/kubernetes.yaml +0 -0
  20. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/docs/index.md +0 -0
  21. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/docs/modules/gpustack_runtime.deployer.md +0 -0
  22. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/docs/modules/gpustack_runtime.detector.md +0 -0
  23. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/docs/modules/gpustack_runtime.md +0 -0
  24. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/__init__.py +0 -0
  25. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/__main__.py +0 -0
  26. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/_version.pyi +0 -0
  27. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/cmds/__init__.py +0 -0
  28. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/cmds/__types__.py +0 -0
  29. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/cmds/deployer.py +0 -0
  30. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/cmds/detector.py +0 -0
  31. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/cmds/images.py +0 -0
  32. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/deployer/__init__.py +0 -0
  33. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/deployer/__patches__.py +0 -0
  34. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/deployer/__utils__.py +0 -0
  35. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/deployer/cdi/__init__.py +0 -0
  36. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/deployer/cdi/__types__.py +0 -0
  37. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/deployer/cdi/__utils__.py +0 -0
  38. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/deployer/cdi/amd.py +0 -0
  39. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/deployer/cdi/ascend.py +0 -0
  40. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/deployer/cdi/hygon.py +0 -0
  41. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/deployer/cdi/iluvatar.py +0 -0
  42. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/deployer/cdi/metax.py +0 -0
  43. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/deployer/cdi/thead.py +0 -0
  44. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/deployer/docker.py +0 -0
  45. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/deployer/k8s/devicemanager/__init__.py +0 -0
  46. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/deployer/podman.py +0 -0
  47. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/__init__.py +0 -0
  48. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/__types__.py +0 -0
  49. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/__utils__.py +0 -0
  50. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/amd.py +0 -0
  51. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/ascend.py +0 -0
  52. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/cambricon.py +0 -0
  53. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/hygon.py +0 -0
  54. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/iluvatar.py +0 -0
  55. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/metax.py +0 -0
  56. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/mthreads.py +0 -0
  57. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/nvidia.py +0 -0
  58. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/pyamdgpu/__init__.py +0 -0
  59. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/pyamdsmi/__init__.py +0 -0
  60. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/pydcmi/__init__.py +0 -0
  61. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/pyhgml/__init__.py +0 -0
  62. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/pyhgml/libhgml.so +0 -0
  63. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/pyhgml/libuki.so +0 -0
  64. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/pyhsa/__init__.py +0 -0
  65. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/pyixml/__init__.py +0 -0
  66. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/pymtml/__init__.py +0 -0
  67. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/pymxsml/__init__.py +0 -0
  68. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/pynvml/__init__.py +0 -0
  69. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/pyrocmsmi/__init__.py +0 -0
  70. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/detector/thead.py +0 -0
  71. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/envs.py +0 -0
  72. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/gpustack_runtime/logging.py +0 -0
  73. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/hatch.toml +0 -0
  74. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/mkdocs.yml +0 -0
  75. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/pack/Dockerfile +0 -0
  76. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/pack/Dockerfile.dummy +0 -0
  77. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/pyproject.toml +0 -0
  78. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/pytest.ini +0 -0
  79. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/ruff.toml +0 -0
  80. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/deployer/fixtures/__init__.py +0 -0
  81. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/deployer/fixtures/test_compare_versions.json +0 -0
  82. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/deployer/fixtures/test_correct_runner_image.json +0 -0
  83. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/deployer/fixtures/test_load_yaml_or_json.json +0 -0
  84. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/deployer/fixtures/test_load_yaml_or_json_multiple_jsons.json +0 -0
  85. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/deployer/fixtures/test_load_yaml_or_json_multiple_yamls.yaml +0 -0
  86. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/deployer/fixtures/test_load_yaml_or_json_single_json.json +0 -0
  87. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/deployer/fixtures/test_load_yaml_or_json_single_yaml.yaml +0 -0
  88. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/deployer/fixtures/test_nginx_entrypoint.sh +0 -0
  89. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/deployer/test_utils.py +0 -0
  90. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/fixtures/__init__.py +0 -0
  91. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/README.md +0 -0
  92. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/detect_output_amd_mi300x.json +0 -0
  93. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/detect_output_amd_mi308x.json +0 -0
  94. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/detect_output_amd_rx7800xt.json +0 -0
  95. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/detect_output_ascend_310p3.json +0 -0
  96. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/detect_output_ascend_910b2.json +0 -0
  97. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/detect_output_hygon_k100ai.json +0 -0
  98. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/detect_output_metax_c500.json +0 -0
  99. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_gb10.json +0 -0
  100. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_h100.json +0 -0
  101. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_h100_mig.json +0 -0
  102. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_h200.json +0 -0
  103. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_rtx4080super.json +0 -0
  104. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_rtx4090d.json +0 -0
  105. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_rtx5090d.json +0 -0
  106. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/detect_output_thead_ppu.json +0 -0
  107. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/topology_output_amd_mi300x.json +0 -0
  108. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/topology_output_amd_mi308x.json +0 -0
  109. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/topology_output_amd_rx7800xt.json +0 -0
  110. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/topology_output_ascend_310p3.json +0 -0
  111. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/topology_output_ascend_910b2.json +0 -0
  112. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/topology_output_hygon_k100ai.json +0 -0
  113. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/topology_output_metax_c500.json +0 -0
  114. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/topology_output_mthreads_s5000.json +0 -0
  115. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/topology_output_nvidia_h100.json +0 -0
  116. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/topology_output_nvidia_h100_mig.json +0 -0
  117. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/topology_output_nvidia_h200.json +0 -0
  118. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/topology_output_nvidia_rtx4080super.json +0 -0
  119. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/topology_output_nvidia_rtx4090d.json +0 -0
  120. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/topology_output_nvidia_rtx5090d.json +0 -0
  121. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/samples/topology_output_thead_ppu.json +0 -0
  122. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/test_amd.py +0 -0
  123. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/test_ascend.py +0 -0
  124. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/test_cambricon.py +0 -0
  125. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/test_detector_utils.py +0 -0
  126. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/test_hygon.py +0 -0
  127. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/test_iluvatar.py +0 -0
  128. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/test_metax.py +0 -0
  129. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/test_mthreads.py +0 -0
  130. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/tests/gpustack_runtime/detector/test_nvidia.py +0 -0
  131. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/uv.lock +0 -0
  132. {gpustack_runtime-0.2.2 → gpustack_runtime-0.2.2.post1}/uv.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gpustack-runtime
3
- Version: 0.2.2
3
+ Version: 0.2.2.post1
4
4
  Summary: GPUStack Runtime is library for detecting GPU resources and launching GPU workloads.
5
5
  Project-URL: Homepage, https://github.com/gpustack/runtime
6
6
  Project-URL: Bug Tracker, https://github.com/gpustack/gpustack/issues
@@ -27,8 +27,8 @@ version_tuple: VERSION_TUPLE
27
27
  __commit_id__: COMMIT_ID
28
28
  commit_id: COMMIT_ID
29
29
 
30
- __version__ = version = '0.2.2'
31
- __version_tuple__ = version_tuple = (0, 2, 2)
30
+ __version__ = version = '0.2.2.post1'
31
+ __version_tuple__ = version_tuple = (0, 2, 2, 'post1')
32
32
  try:
33
33
  from ._version_appendix import git_commit
34
34
  __commit_id__ = commit_id = git_commit
@@ -0,0 +1 @@
1
+ git_commit = "4d942f0"
@@ -843,6 +843,8 @@ class WorkloadPlan(WorkloadSecurity):
843
843
  Name for the workload, it should be unique in the deployer.
844
844
  labels (dict[str, str] | None):
845
845
  Labels for the workload.
846
+ instance_type (str | None):
847
+ Name of the operator InstanceType the workload deploys onto.
846
848
  host_network (bool):
847
849
  Indicates if the containers of the workload use the host network.
848
850
  host_ipc (bool):
@@ -878,6 +880,13 @@ class WorkloadPlan(WorkloadSecurity):
878
880
  """
879
881
  Labels for the workload.
880
882
  """
883
+ instance_type: str | None = None
884
+ """
885
+ Name of the operator InstanceType the workload deploys onto.
886
+ When set (and Kueue admission is not disabled), the Kubernetes deployer
887
+ stamps the queue-name label of the InstanceType's entrance LocalQueue
888
+ onto the Pod so it is admitted by Kueue.
889
+ """
881
890
  host_network: bool = False
882
891
  """
883
892
  Indicates if the containers of the workload use the host network.
@@ -278,6 +278,30 @@ Name of the Kubernetes deployer.
278
278
  """
279
279
 
280
280
 
281
+ def _apply_instance_type_admission(
282
+ pod: kubernetes.client.V1Pod,
283
+ instance_type: str | None,
284
+ ) -> None:
285
+ """
286
+ Stamp the Kueue queue-name label of the InstanceType's entrance
287
+ LocalQueue onto the Pod, so the workload is admitted through the
288
+ operator's queue for that InstanceType. The LocalQueue name is the
289
+ FNV-1a 64 hash of the InstanceType name, mirroring the operator's
290
+ FormatLocalQueueName ("gpustack-fnv64-<fnv64a-hex>").
291
+
292
+ Skipped when no InstanceType is set, or when Kueue admission is
293
+ disabled via GPUSTACK_RUNTIME_KUBERNETES_KDP_NO_KUEUE_ADMISSION —
294
+ then the Pod is scheduled by the plain Kubernetes scheduler.
295
+ """
296
+ if not instance_type:
297
+ return
298
+ if envs.GPUSTACK_RUNTIME_KUBERNETES_KDP_NO_KUEUE_ADMISSION:
299
+ return
300
+ pod.metadata.labels["kueue.x-k8s.io/queue-name"] = (
301
+ f"gpustack-fnv64-{fnv1a_64_hex(instance_type)}"
302
+ )
303
+
304
+
281
305
  def _pin_pod_for_kueue(
282
306
  pod: kubernetes.client.V1Pod,
283
307
  node_name: str | None,
@@ -1091,11 +1115,6 @@ class KubernetesDeployer(EndoscopicDeployer):
1091
1115
  if kdp:
1092
1116
  # Request quantity of devices as resources for KDP to schedule on the correct nodes.
1093
1117
  resources.update(r_vs)
1094
- # Request quantity of devices with Kueue admission.
1095
- if not envs.GPUSTACK_RUNTIME_KUBERNETES_KDP_NO_KUEUE_ADMISSION:
1096
- pod.metadata.labels["kueue.x-k8s.io/queue-name"] = (
1097
- self._find_kueue_queue_name(ren)
1098
- )
1099
1118
  continue
1100
1119
  # Request device via visible devices env.
1101
1120
  container.env.append(
@@ -1119,11 +1138,6 @@ class KubernetesDeployer(EndoscopicDeployer):
1119
1138
  ] = ",".join(resource_values)
1120
1139
  # Request quantity of devices as resources for KDP to schedule on the correct nodes.
1121
1140
  resources.update(r_vs)
1122
- # Request quantity of devices with Kueue admission.
1123
- if not envs.GPUSTACK_RUNTIME_KUBERNETES_KDP_NO_KUEUE_ADMISSION:
1124
- pod.metadata.labels["kueue.x-k8s.io/queue-name"] = (
1125
- self._find_kueue_queue_name(ren)
1126
- )
1127
1141
  continue
1128
1142
 
1129
1143
  # Request all devices if privileged,
@@ -1225,6 +1239,7 @@ class KubernetesDeployer(EndoscopicDeployer):
1225
1239
 
1226
1240
  core_api = kubernetes.client.CoreV1Api(self._client)
1227
1241
  try:
1242
+ _apply_instance_type_admission(pod, workload.instance_type)
1228
1243
  _pin_pod_for_kueue(pod, self._node_name)
1229
1244
 
1230
1245
  pod = self._mutate_create_pod(pod)
@@ -1583,31 +1598,6 @@ class KubernetesDeployer(EndoscopicDeployer):
1583
1598
  namespace=self_pod_namespace,
1584
1599
  )
1585
1600
 
1586
- def _find_kueue_queue_name(self, runtime_env: str) -> str:
1587
- manu = self.get_manufacturer(runtime_env)
1588
- core_api = kubernetes.client.CoreV1Api(self._client)
1589
- try:
1590
- # Iterate the labels of node to find the key as below:
1591
- # "feature.gpustack.ai/${manu}-${device-group-id}.profile-queue: <profile>",
1592
- # then combine the manufacturer, device group id and profile to get the queue name for Kueue admission.
1593
- #
1594
- # For example, for `feature.gpustack.ai/nvidia-tesla-t4.profile-queue: 12c-46g-1d`,
1595
- # the node key is `nvidia-tesla-t4`,
1596
- # the queue name is `gpustack-nvidia-tesla-t4-12c-46g-1d`.
1597
- node = core_api.read_node(name=self._node_name)
1598
- prefix = "feature.gpustack.ai/"
1599
- suffix = ".profile-queue"
1600
- for k, v in node.metadata.labels.items():
1601
- if k.startswith(f"{prefix}{manu}-") and k.endswith(suffix):
1602
- node_key = k[len(prefix) : -len(suffix)]
1603
- return f"gpustack-{node_key}-{v}"
1604
- except kubernetes.client.exceptions.ApiException as e:
1605
- msg = f"Failed to get Kueue queue name on node {self._node_name} for runtime environment {runtime_env}{_detail_api_call_error(e)}"
1606
- raise OperationError(msg) from e
1607
-
1608
- msg = f"Failed to find Kueue queue name on node {self._node_name} for runtime environment {runtime_env}"
1609
- raise OperationError(msg)
1610
-
1611
1601
  @_supported
1612
1602
  def _create(self, workload: WorkloadPlan):
1613
1603
  """
@@ -2,6 +2,7 @@ from datetime import datetime, timezone
2
2
 
3
3
  import kubernetes.client
4
4
 
5
+ from gpustack_runtime import envs
5
6
  from gpustack_runtime.deployer.__types__ import WorkloadStatus
6
7
  from gpustack_runtime.deployer.kuberentes import (
7
8
  KubernetesWorkloadStatus,
@@ -115,3 +116,40 @@ def test_kubernetes_workload_status_state_message():
115
116
  def test_kubernetes_workload_status_state_message_default():
116
117
  status = KubernetesWorkloadStatus(name="test", k_pod=_pod())
117
118
  assert status.state_message == ""
119
+
120
+
121
+ from gpustack_runtime.deployer.kuberentes import ( # noqa: E402
122
+ _apply_instance_type_admission,
123
+ )
124
+
125
+
126
+ def test_apply_instance_type_admission_stamps_entrance_queue():
127
+ pod = _pinning_pod()
128
+ _apply_instance_type_admission(
129
+ pod,
130
+ "gpustack--nvidia-geforce-rtx-4090-linux-amd64",
131
+ )
132
+ # Vector observed on a live operator cluster.
133
+ assert (
134
+ pod.metadata.labels["kueue.x-k8s.io/queue-name"]
135
+ == "gpustack-fnv64-1a7145d0a5248d55"
136
+ )
137
+
138
+
139
+ def test_apply_instance_type_admission_skipped_without_instance_type():
140
+ pod = _pinning_pod()
141
+ _apply_instance_type_admission(pod, None)
142
+ assert "kueue.x-k8s.io/queue-name" not in pod.metadata.labels
143
+
144
+
145
+ def test_apply_instance_type_admission_disabled_by_env(monkeypatch):
146
+ monkeypatch.setenv("GPUSTACK_RUNTIME_KUBERNETES_KDP_NO_KUEUE_ADMISSION", "true")
147
+
148
+ monkeypatch.setattr(
149
+ envs,
150
+ "GPUSTACK_RUNTIME_KUBERNETES_KDP_NO_KUEUE_ADMISSION",
151
+ True,
152
+ )
153
+ pod = _pinning_pod()
154
+ _apply_instance_type_admission(pod, "some-type")
155
+ assert "kueue.x-k8s.io/queue-name" not in pod.metadata.labels
@@ -1 +0,0 @@
1
- git_commit = "3ea35d7"