konduktor-nightly 0.1.0.dev20250623105113__tar.gz → 0.1.0.dev20250625105100__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 (97) hide show
  1. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/PKG-INFO +1 -4
  2. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/README.md +0 -3
  3. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/__init__.py +2 -2
  4. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/backends/jobset_utils.py +5 -2
  5. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/logging.py +26 -8
  6. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/resource.py +1 -1
  7. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/utils/validator.py +16 -3
  8. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/pyproject.toml +1 -1
  9. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/LICENSE +0 -0
  10. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/adaptors/__init__.py +0 -0
  11. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/adaptors/aws.py +0 -0
  12. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/adaptors/common.py +0 -0
  13. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/adaptors/gcp.py +0 -0
  14. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/authentication.py +0 -0
  15. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/backends/__init__.py +0 -0
  16. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/backends/backend.py +0 -0
  17. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/backends/jobset.py +0 -0
  18. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/check.py +0 -0
  19. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/cli.py +0 -0
  20. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/config.py +0 -0
  21. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/constants.py +0 -0
  22. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/controller/__init__.py +0 -0
  23. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/controller/constants.py +0 -0
  24. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/controller/launch.py +0 -0
  25. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/controller/node.py +0 -0
  26. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/controller/parse.py +0 -0
  27. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/README.md +0 -0
  28. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/backend/main.py +0 -0
  29. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/backend/sockets.py +0 -0
  30. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/.eslintrc.json +0 -0
  31. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/.gitignore +0 -0
  32. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/app/api/jobs/route.js +0 -0
  33. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/app/api/namespaces/route.js +0 -0
  34. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/app/components/Grafana.jsx +0 -0
  35. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/app/components/JobsData.jsx +0 -0
  36. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/app/components/LogsData.jsx +0 -0
  37. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/app/components/NavMenu.jsx +0 -0
  38. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/app/components/NavTabs.jsx +0 -0
  39. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/app/components/NavTabs2.jsx +0 -0
  40. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/app/components/SelectBtn.jsx +0 -0
  41. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/app/components/lib/utils.js +0 -0
  42. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/app/components/ui/chip-select.jsx +0 -0
  43. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/app/components/ui/input.jsx +0 -0
  44. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/app/components/ui/navigation-menu.jsx +0 -0
  45. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/app/components/ui/select.jsx +0 -0
  46. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/app/favicon.ico +0 -0
  47. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/app/globals.css +0 -0
  48. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/app/jobs/page.js +0 -0
  49. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/app/layout.js +0 -0
  50. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/app/logs/page.js +0 -0
  51. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/app/page.js +0 -0
  52. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/jsconfig.json +0 -0
  53. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/next.config.mjs +0 -0
  54. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/package-lock.json +0 -0
  55. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/package.json +0 -0
  56. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/postcss.config.mjs +0 -0
  57. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/server.js +0 -0
  58. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/dashboard/frontend/tailwind.config.js +0 -0
  59. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/data/__init__.py +0 -0
  60. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/data/aws/__init__.py +0 -0
  61. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/data/aws/s3.py +0 -0
  62. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/data/constants.py +0 -0
  63. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/data/data_utils.py +0 -0
  64. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/data/gcp/__init__.py +0 -0
  65. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/data/gcp/constants.py +0 -0
  66. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/data/gcp/gcs.py +0 -0
  67. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/data/gcp/utils.py +0 -0
  68. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/data/registry.py +0 -0
  69. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/data/storage.py +0 -0
  70. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/data/storage_utils.py +0 -0
  71. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/execution.py +0 -0
  72. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/kube_client.py +0 -0
  73. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/manifests/controller_deployment.yaml +0 -0
  74. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/manifests/dashboard_deployment.yaml +0 -0
  75. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/manifests/dmesg_daemonset.yaml +0 -0
  76. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/manifests/pod_cleanup_controller.yaml +0 -0
  77. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/task.py +0 -0
  78. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/templates/jobset.yaml.j2 +0 -0
  79. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/templates/pod.yaml.j2 +0 -0
  80. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/usage/__init__.py +0 -0
  81. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/usage/constants.py +0 -0
  82. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/utils/__init__.py +0 -0
  83. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/utils/accelerator_registry.py +0 -0
  84. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/utils/annotations.py +0 -0
  85. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/utils/base64_utils.py +0 -0
  86. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/utils/common_utils.py +0 -0
  87. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/utils/constants.py +0 -0
  88. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/utils/env_options.py +0 -0
  89. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/utils/exceptions.py +0 -0
  90. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/utils/kubernetes_enums.py +0 -0
  91. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/utils/kubernetes_utils.py +0 -0
  92. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/utils/log_utils.py +0 -0
  93. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/utils/loki_utils.py +0 -0
  94. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/utils/rich_utils.py +0 -0
  95. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/utils/schemas.py +0 -0
  96. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/utils/subprocess_utils.py +0 -0
  97. {konduktor_nightly-0.1.0.dev20250623105113 → konduktor_nightly-0.1.0.dev20250625105100}/konduktor/utils/ux_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: konduktor-nightly
3
- Version: 0.1.0.dev20250623105113
3
+ Version: 0.1.0.dev20250625105100
4
4
  Summary: GPU Cluster Health Management
5
5
  Author: Andrew Aikawa
6
6
  Author-email: asai@berkeley.edu
@@ -68,9 +68,6 @@ resources:
68
68
  kueue.x-k8s.io/queue-name: user-queue
69
69
  kueue.x-k8s.io/priority-class: low-priority
70
70
 
71
- setup: |
72
- pip install torch torchvision
73
-
74
71
  run: |
75
72
  torchrun \
76
73
  --nproc_per_node 8 \
@@ -34,9 +34,6 @@ resources:
34
34
  kueue.x-k8s.io/queue-name: user-queue
35
35
  kueue.x-k8s.io/priority-class: low-priority
36
36
 
37
- setup: |
38
- pip install torch torchvision
39
-
40
37
  run: |
41
38
  torchrun \
42
39
  --nproc_per_node 8 \
@@ -14,7 +14,7 @@ __all__ = [
14
14
  ]
15
15
 
16
16
  # Replaced with the current commit when building the wheels.
17
- _KONDUKTOR_COMMIT_SHA = 'd7cf0201d5498c86113628b414d2112670a356d6'
17
+ _KONDUKTOR_COMMIT_SHA = '249f48b15859d1a210ca9b28e6e9cd85ac19ac68'
18
18
  os.makedirs(os.path.expanduser('~/.konduktor'), exist_ok=True)
19
19
 
20
20
 
@@ -48,5 +48,5 @@ def _get_git_commit():
48
48
 
49
49
 
50
50
  __commit__ = _get_git_commit()
51
- __version__ = '1.0.0.dev0.1.0.dev20250623105113'
51
+ __version__ = '1.0.0.dev0.1.0.dev20250625105100'
52
52
  __root_dir__ = os.path.dirname(os.path.abspath(__file__))
@@ -10,6 +10,7 @@ from datetime import datetime, timezone
10
10
  from typing import Any, Dict, Optional, Tuple
11
11
  from urllib.parse import urlparse
12
12
 
13
+ import click
13
14
  import colorama
14
15
 
15
16
  if typing.TYPE_CHECKING:
@@ -272,8 +273,10 @@ def create_pod_spec(task: 'konduktor.Task') -> Dict[str, Any]:
272
273
  )
273
274
 
274
275
  # validate pod spec using json schema
275
- # schema: https://github.com/instrumenta/kubernetes-json-schema/blob/master/v1.9.8-standalone-strict/podspec.json
276
- validator.validate_pod_spec(pod_config['kubernetes']['pod_config']['spec'])
276
+ try:
277
+ validator.validate_pod_spec(pod_config['kubernetes']['pod_config']['spec'])
278
+ except ValueError as e:
279
+ raise click.UsageError(str(e))
277
280
 
278
281
  return pod_config
279
282
 
@@ -17,6 +17,7 @@ _FORMAT = '[%(levelname).1s %(asctime)s %(filename)s:%(lineno)d] %(message)s'
17
17
  _DATE_FORMAT = '%m-%d %H:%M:%S'
18
18
 
19
19
  _logging_config = threading.local()
20
+ _log_path = None
20
21
 
21
22
 
22
23
  class NewLineFormatter(logging.Formatter):
@@ -51,19 +52,36 @@ def set_logging_level(logger: str, level: int):
51
52
 
52
53
 
53
54
  def get_logger(name: str):
54
- # Determine the logging level based on the KONDUKTOR_DEBUG environment variable
55
- log_level = logging.INFO
56
- if os.environ.get('KONDUKTOR_DEBUG', None) == '1':
57
- log_level = logging.DEBUG
55
+ global _log_path
58
56
 
59
- # Configure the logger
60
57
  logger = logging.getLogger(name)
61
- if not logger.hasHandlers(): # Check if the logger already has handlers
62
- logger.setLevel(log_level)
58
+
59
+ # Avoid duplicate handlers
60
+ if logger.hasHandlers():
61
+ return logger
62
+
63
+ logger.setLevel(logging.DEBUG) # Always capture all levels internally
64
+
65
+ # --- File logging: Always enabled ---
66
+ if not _log_path:
67
+ log_dir = os.path.expanduser('~/.konduktor/logs')
68
+ os.makedirs(log_dir, exist_ok=True)
69
+ timestamp = datetime.now().strftime('%Y%m%d-%H%M%S')
70
+ _log_path = os.path.join(log_dir, f'konduktor-logs-{timestamp}.log')
71
+ print(f'Log file: {_log_path}')
72
+
73
+ fh = logging.FileHandler(_log_path)
74
+ fh.setLevel(logging.DEBUG)
75
+ fh.setFormatter(FORMATTER)
76
+ logger.addHandler(fh)
77
+
78
+ # --- Console logging: DEBUG level only if KONDUKTOR_DEBUG=1 ---
79
+ if os.environ.get('KONDUKTOR_DEBUG') == '1':
63
80
  ch = logging.StreamHandler()
64
- ch.setLevel(log_level)
81
+ ch.setLevel(logging.DEBUG)
65
82
  ch.setFormatter(FORMATTER)
66
83
  logger.addHandler(ch)
84
+
67
85
  logger.propagate = False
68
86
  return logger
69
87
 
@@ -426,7 +426,7 @@ class Resources:
426
426
  common_utils.validate_schema(
427
427
  config['job_config'],
428
428
  schemas.get_job_schema(),
429
- 'Invalid job config YAML',
429
+ 'Invalid job config YAML: ',
430
430
  )
431
431
 
432
432
  def _override_resources(
@@ -14,12 +14,16 @@ import requests
14
14
  from colorama import Fore, Style
15
15
  from filelock import FileLock
16
16
 
17
+ from konduktor import logging
18
+
17
19
  SCHEMA_VERSION = 'v1.32.0-standalone-strict'
18
20
  SCHEMA_URL = f'https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/{SCHEMA_VERSION}/podspec.json'
19
21
  SCHEMA_CACHE_PATH = Path.home() / '.konduktor/schemas/podspec.json'
20
22
  SCHEMA_LOCK_PATH = SCHEMA_CACHE_PATH.with_suffix('.lock')
21
23
  CACHE_MAX_AGE_SECONDS = 86400 # 24 hours
22
24
 
25
+ logger = logging.get_logger(__name__)
26
+
23
27
 
24
28
  def case_insensitive_enum(validator, enums, instance, schema):
25
29
  del validator, schema # Unused.
@@ -65,6 +69,16 @@ def validate_pod_spec(pod_spec: dict) -> None:
65
69
  return
66
70
 
67
71
  formatted = [
72
+ f'- {error.message}'
73
+ + (f" at path: {' → '.join(str(p) for p in error.path)}" if error.path else '')
74
+ for error in errors
75
+ ]
76
+
77
+ # Clean log
78
+ logger.debug('Invalid k8s pod spec/config:\n%s', '\n'.join(formatted))
79
+
80
+ # Color only in CLI
81
+ formatted_colored = [
68
82
  f'{Fore.RED}- {error.message}'
69
83
  + (f" at path: {' → '.join(str(p) for p in error.path)}" if error.path else '')
70
84
  + Style.RESET_ALL
@@ -72,7 +86,6 @@ def validate_pod_spec(pod_spec: dict) -> None:
72
86
  ]
73
87
 
74
88
  raise ValueError(
75
- f'\n{Fore.RED}Invalid k8s pod spec/config: \
76
- {Style.RESET_ALL}\n'
77
- + '\n'.join(formatted)
89
+ f'\n{Fore.RED}Invalid k8s pod spec/config: {Style.RESET_ALL}\n'
90
+ + '\n'.join(formatted_colored)
78
91
  )
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "konduktor-nightly"
3
- version = "0.1.0.dev20250623105113"
3
+ version = "0.1.0.dev20250625105100"
4
4
  description = "GPU Cluster Health Management"
5
5
  packages = [
6
6
  {include = "konduktor"}