konduktor-nightly 0.1.0.dev20250820104812__tar.gz → 0.1.0.dev20250822104721__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.
Potentially problematic release.
This version of konduktor-nightly might be problematic. Click here for more details.
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/PKG-INFO +1 -1
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/__init__.py +2 -2
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/backends/deployment_utils.py +6 -3
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/backends/jobset_utils.py +53 -28
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/backends/pod_utils.py +2 -10
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/cli.py +18 -1
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/resource.py +7 -1
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/templates/jobset.yaml.j2 +5 -1
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/templates/pod.yaml.j2 +17 -8
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/utils/log_utils.py +2 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/utils/schemas.py +2 -1
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/pyproject.toml +1 -1
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/LICENSE +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/README.md +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/adaptors/__init__.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/adaptors/aws.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/adaptors/common.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/adaptors/gcp.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/authentication.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/backends/__init__.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/backends/backend.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/backends/constants.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/backends/deployment.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/backends/jobset.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/check.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/config.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/constants.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/controller/__init__.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/controller/constants.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/controller/launch.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/controller/node.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/controller/parse.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/README.md +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/backend/main.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/backend/sockets.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/.eslintrc.json +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/.gitignore +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/app/api/jobs/route.js +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/app/api/namespaces/route.js +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/app/components/Grafana.jsx +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/app/components/JobsData.jsx +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/app/components/LogsData.jsx +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/app/components/NavMenu.jsx +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/app/components/NavTabs.jsx +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/app/components/NavTabs2.jsx +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/app/components/SelectBtn.jsx +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/app/components/lib/utils.js +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/app/components/ui/chip-select.jsx +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/app/components/ui/input.jsx +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/app/components/ui/navigation-menu.jsx +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/app/components/ui/select.jsx +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/app/favicon.ico +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/app/globals.css +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/app/jobs/page.js +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/app/layout.js +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/app/logs/page.js +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/app/page.js +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/jsconfig.json +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/next.config.mjs +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/package-lock.json +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/package.json +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/postcss.config.mjs +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/server.js +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/dashboard/frontend/tailwind.config.js +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/data/__init__.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/data/aws/__init__.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/data/aws/s3.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/data/constants.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/data/data_utils.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/data/gcp/__init__.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/data/gcp/constants.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/data/gcp/gcs.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/data/gcp/utils.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/data/registry.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/data/storage.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/data/storage_utils.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/execution.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/kube_client.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/logging.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/manifests/controller_deployment.yaml +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/manifests/dashboard_deployment.yaml +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/manifests/dmesg_daemonset.yaml +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/manifests/pod_cleanup_controller.yaml +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/serving.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/task.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/templates/deployment.yaml.j2 +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/usage/__init__.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/usage/constants.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/utils/__init__.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/utils/accelerator_registry.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/utils/annotations.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/utils/base64_utils.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/utils/common_utils.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/utils/constants.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/utils/env_options.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/utils/exceptions.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/utils/kubernetes_enums.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/utils/kubernetes_utils.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/utils/loki_utils.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/utils/rich_utils.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/utils/subprocess_utils.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/utils/ux_utils.py +0 -0
- {konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/konduktor/utils/validator.py +0 -0
|
@@ -11,7 +11,7 @@ from konduktor.task import Task
|
|
|
11
11
|
__all__ = ['launch', 'Resources', 'Task', 'Serving']
|
|
12
12
|
|
|
13
13
|
# Replaced with the current commit when building the wheels.
|
|
14
|
-
_KONDUKTOR_COMMIT_SHA = '
|
|
14
|
+
_KONDUKTOR_COMMIT_SHA = 'face26aca22b99192e740dca4875261fcffa2a55'
|
|
15
15
|
os.makedirs(os.path.expanduser('~/.konduktor'), exist_ok=True)
|
|
16
16
|
|
|
17
17
|
|
|
@@ -45,5 +45,5 @@ def _get_git_commit():
|
|
|
45
45
|
|
|
46
46
|
|
|
47
47
|
__commit__ = _get_git_commit()
|
|
48
|
-
__version__ = '1.0.0.dev0.1.0.
|
|
48
|
+
__version__ = '1.0.0.dev0.1.0.dev20250822104721'
|
|
49
49
|
__root_dir__ = os.path.dirname(os.path.abspath(__file__))
|
|
@@ -47,8 +47,6 @@ _DEPLOYMENT_METADATA_LABELS = {
|
|
|
47
47
|
'model_name_label': AIBRIX_NAME_LABEL,
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
_RUN_DURATION_ANNOTATION_KEY = 'kueue.x-k8s.io/maxRunDurationSeconds'
|
|
51
|
-
|
|
52
50
|
|
|
53
51
|
def render_specs(
|
|
54
52
|
task: 'konduktor.Task',
|
|
@@ -781,7 +779,12 @@ def show_status_table(namespace: str, all_users: bool):
|
|
|
781
779
|
)
|
|
782
780
|
if port_obj and port_obj.port:
|
|
783
781
|
port_str = str(port_obj.port)
|
|
784
|
-
|
|
782
|
+
|
|
783
|
+
# For vLLM deployments, don't append port since external routing is on port 80
|
|
784
|
+
if AIBRIX_NAME_LABEL in labels:
|
|
785
|
+
endpoint_str = ip_str
|
|
786
|
+
else:
|
|
787
|
+
endpoint_str = f'{ip_str}:{port_str}' if port_str else ip_str
|
|
785
788
|
|
|
786
789
|
# Replicas
|
|
787
790
|
ready_replicas = (
|
|
@@ -464,6 +464,41 @@ def _get_end_time_from_conditions(job: Dict[str, Any]) -> str:
|
|
|
464
464
|
return '-'
|
|
465
465
|
|
|
466
466
|
|
|
467
|
+
def _get_time_delta(delta: 'timedelta') -> Tuple[str, 'timedelta']:
|
|
468
|
+
total_seconds = int(delta.total_seconds())
|
|
469
|
+
|
|
470
|
+
days, remainder = divmod(total_seconds, 86400) # 86400 seconds in a day
|
|
471
|
+
hours, remainder = divmod(remainder, 3600) # 3600 seconds in an hour
|
|
472
|
+
minutes, seconds = divmod(remainder, 60) # 60 seconds in a minute
|
|
473
|
+
|
|
474
|
+
days_str = f'{days} day{"s" if days != 1 else ""}, ' if days > 0 else ''
|
|
475
|
+
hours_str = f'{hours} hr{"s" if hours != 1 else ""}, ' if hours > 0 else ''
|
|
476
|
+
minutes_str = (
|
|
477
|
+
f'{minutes} min{"s" if minutes != 1 else ""}'
|
|
478
|
+
if minutes > 0 and days == 0
|
|
479
|
+
else ''
|
|
480
|
+
)
|
|
481
|
+
|
|
482
|
+
seconds_str = (
|
|
483
|
+
f'{seconds} sec{"s" if seconds != 1 else ""}'
|
|
484
|
+
if seconds > 0 and days == 0 and hours == 0 and minutes == 0
|
|
485
|
+
else ''
|
|
486
|
+
)
|
|
487
|
+
|
|
488
|
+
result = f'{days_str}{hours_str}{minutes_str}{seconds_str}'
|
|
489
|
+
return result if result else '<1 minute', delta
|
|
490
|
+
|
|
491
|
+
|
|
492
|
+
def _get_job_length(start_time: str, end_time: str) -> str:
|
|
493
|
+
if start_time == '-' or end_time == '-':
|
|
494
|
+
return '-'
|
|
495
|
+
else:
|
|
496
|
+
start = datetime.strptime(start_time, '%m/%d/%y %I:%M%p')
|
|
497
|
+
end = datetime.strptime(end_time, '%m/%d/%y %I:%M%p')
|
|
498
|
+
delta, _ = _get_time_delta(end - start)
|
|
499
|
+
return delta
|
|
500
|
+
|
|
501
|
+
|
|
467
502
|
def show_status_table(
|
|
468
503
|
namespace: str,
|
|
469
504
|
all_users: bool,
|
|
@@ -531,32 +566,6 @@ def show_status_table(
|
|
|
531
566
|
f'{JobStatus.PENDING.name}{colorama.Style.RESET_ALL}'
|
|
532
567
|
)
|
|
533
568
|
|
|
534
|
-
def _get_time_delta(timestamp: str) -> Tuple[str, 'timedelta']:
|
|
535
|
-
delta = datetime.now(timezone.utc) - datetime.strptime(
|
|
536
|
-
timestamp, '%Y-%m-%dT%H:%M:%SZ'
|
|
537
|
-
).replace(tzinfo=timezone.utc)
|
|
538
|
-
total_seconds = int(delta.total_seconds())
|
|
539
|
-
|
|
540
|
-
days, remainder = divmod(total_seconds, 86400) # 86400 seconds in a day
|
|
541
|
-
hours, remainder = divmod(remainder, 3600) # 3600 seconds in an hour
|
|
542
|
-
minutes, seconds = divmod(remainder, 60) # 60 seconds in a minute
|
|
543
|
-
|
|
544
|
-
days_str = f'{days} day{"s" if days != 1 else ""}, ' if days > 0 else ''
|
|
545
|
-
hours_str = f'{hours} hr{"s" if hours != 1 else ""}, ' if hours > 0 else ''
|
|
546
|
-
minutes_str = (
|
|
547
|
-
f'{minutes} min{"s" if minutes != 1 else ""}'
|
|
548
|
-
if minutes > 0 and days == 0
|
|
549
|
-
else ''
|
|
550
|
-
)
|
|
551
|
-
seconds_str = (
|
|
552
|
-
f'{seconds} sec{"s" if seconds != 1 else ""}'
|
|
553
|
-
if seconds > 0 and days == 0 and hours == 0 and minutes == 0
|
|
554
|
-
else ''
|
|
555
|
-
)
|
|
556
|
-
|
|
557
|
-
result = f'{days_str}{hours_str}{minutes_str}{seconds_str}'
|
|
558
|
-
return result if result else '<1 minute', delta
|
|
559
|
-
|
|
560
569
|
def _get_resources(job: Dict[str, Any]) -> str:
|
|
561
570
|
num_pods = int(
|
|
562
571
|
job['spec']['replicatedJobs'][0]['template']['spec']['parallelism']
|
|
@@ -580,9 +589,18 @@ def show_status_table(
|
|
|
580
589
|
'SUBMITTED',
|
|
581
590
|
'START TIME',
|
|
582
591
|
'END TIME',
|
|
592
|
+
'DURATION',
|
|
583
593
|
]
|
|
584
594
|
else:
|
|
585
|
-
columns = [
|
|
595
|
+
columns = [
|
|
596
|
+
'NAME',
|
|
597
|
+
'STATUS',
|
|
598
|
+
'RESOURCES',
|
|
599
|
+
'SUBMITTED',
|
|
600
|
+
'START TIME',
|
|
601
|
+
'END TIME',
|
|
602
|
+
'DURATION',
|
|
603
|
+
]
|
|
586
604
|
job_table = log_utils.create_table(columns)
|
|
587
605
|
job_specs = list_jobset(namespace)
|
|
588
606
|
assert job_specs is not None, 'Retrieving jobs failed'
|
|
@@ -621,13 +639,18 @@ def show_status_table(
|
|
|
621
639
|
start_time = _format_timestamp(start_time)
|
|
622
640
|
|
|
623
641
|
# Get submitted time (how long ago)
|
|
624
|
-
|
|
642
|
+
time_delta = datetime.now(timezone.utc) - datetime.strptime(
|
|
643
|
+
job['metadata']['creationTimestamp'], '%Y-%m-%dT%H:%M:%SZ'
|
|
644
|
+
).replace(tzinfo=timezone.utc)
|
|
645
|
+
submitted_time, _ = _get_time_delta(time_delta)
|
|
625
646
|
|
|
626
647
|
# Get end time (from JobSet conditions)
|
|
627
648
|
end_time = _get_end_time_from_conditions(job)
|
|
628
649
|
if end_time != '-':
|
|
629
650
|
end_time = _format_timestamp(end_time)
|
|
630
651
|
|
|
652
|
+
job_length = _get_job_length(start_time, end_time)
|
|
653
|
+
|
|
631
654
|
if all_users:
|
|
632
655
|
rows.append(
|
|
633
656
|
[
|
|
@@ -638,6 +661,7 @@ def show_status_table(
|
|
|
638
661
|
submitted_time,
|
|
639
662
|
start_time,
|
|
640
663
|
end_time,
|
|
664
|
+
job_length,
|
|
641
665
|
job['metadata']['creationTimestamp'],
|
|
642
666
|
]
|
|
643
667
|
)
|
|
@@ -654,6 +678,7 @@ def show_status_table(
|
|
|
654
678
|
submitted_time,
|
|
655
679
|
start_time,
|
|
656
680
|
end_time,
|
|
681
|
+
job_length,
|
|
657
682
|
job['metadata']['creationTimestamp'],
|
|
658
683
|
]
|
|
659
684
|
)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""Pod utils: handles pod spec creation and manipulation"""
|
|
2
2
|
|
|
3
3
|
import base64
|
|
4
|
+
import json
|
|
4
5
|
import os
|
|
5
6
|
import tempfile
|
|
6
7
|
import typing
|
|
@@ -284,7 +285,7 @@ def create_pod_spec(task: 'konduktor.Task') -> Dict[str, Any]:
|
|
|
284
285
|
pod_config['kubernetes']['pod_config']['spec']['containers'][0]['env'] = list(
|
|
285
286
|
env_map.values()
|
|
286
287
|
)
|
|
287
|
-
logger.debug(f'rendered pod spec: \n\t{pod_config}')
|
|
288
|
+
logger.debug(f'rendered pod spec: \n\t{json.dumps(pod_config, indent=2)}')
|
|
288
289
|
|
|
289
290
|
# validate pod spec using json schema
|
|
290
291
|
try:
|
|
@@ -328,15 +329,6 @@ def inject_deployment_pod_metadata(
|
|
|
328
329
|
if task.resources and task.resources.labels:
|
|
329
330
|
pod_spec['metadata']['labels'].update(task.resources.labels)
|
|
330
331
|
|
|
331
|
-
# Add max run duration annotation
|
|
332
|
-
assert task.resources is not None and task.resources.labels is not None
|
|
333
|
-
maxRunDurationSeconds = task.resources.labels.get('maxRunDurationSeconds', None)
|
|
334
|
-
if not maxRunDurationSeconds:
|
|
335
|
-
raise ValueError('maxRunDurationSeconds is required')
|
|
336
|
-
pod_spec['metadata']['annotations'][_RUN_DURATION_ANNOTATION_KEY] = str(
|
|
337
|
-
maxRunDurationSeconds
|
|
338
|
-
)
|
|
339
|
-
|
|
340
332
|
# Set restart policy for deployments
|
|
341
333
|
pod_spec.setdefault('spec', {})
|
|
342
334
|
pod_spec['spec']['restartPolicy'] = 'Always'
|
|
@@ -104,6 +104,7 @@ def _make_task_with_overrides(
|
|
|
104
104
|
instance_type: Optional[str] = None,
|
|
105
105
|
num_nodes: Optional[int] = None,
|
|
106
106
|
max_restarts: Optional[int] = None,
|
|
107
|
+
completions: Optional[int] = None,
|
|
107
108
|
image_id: Optional[str] = None,
|
|
108
109
|
disk_size: Optional[int] = None,
|
|
109
110
|
env: Optional[List[Tuple[str, str]]] = None,
|
|
@@ -166,7 +167,9 @@ def _make_task_with_overrides(
|
|
|
166
167
|
if max_restarts is not None:
|
|
167
168
|
assert task.resources is not None
|
|
168
169
|
task.resources.job_config['max_restarts'] = max_restarts
|
|
169
|
-
|
|
170
|
+
if completions is not None:
|
|
171
|
+
assert task.resources is not None
|
|
172
|
+
task.resources.job_config['completions'] = completions
|
|
170
173
|
if num_nodes is not None:
|
|
171
174
|
task.num_nodes = num_nodes
|
|
172
175
|
if name is not None:
|
|
@@ -215,6 +218,16 @@ _TASK_OPTIONS = [
|
|
|
215
218
|
'supplied.'
|
|
216
219
|
),
|
|
217
220
|
),
|
|
221
|
+
click.option(
|
|
222
|
+
'--completions',
|
|
223
|
+
required=False,
|
|
224
|
+
type=int,
|
|
225
|
+
help=(
|
|
226
|
+
'Number of successful completions required. Overrides YAML.'
|
|
227
|
+
'Overrides the "completions" config in the YAML if both are '
|
|
228
|
+
'supplied.'
|
|
229
|
+
),
|
|
230
|
+
),
|
|
218
231
|
click.option(
|
|
219
232
|
'--cpus',
|
|
220
233
|
default=None,
|
|
@@ -798,6 +811,7 @@ def launch(
|
|
|
798
811
|
memory: Optional[str],
|
|
799
812
|
num_nodes: Optional[int],
|
|
800
813
|
max_restarts: Optional[int],
|
|
814
|
+
completions: Optional[int],
|
|
801
815
|
image_id: Optional[str],
|
|
802
816
|
env_file: Optional[Dict[str, str]],
|
|
803
817
|
env: List[Tuple[str, str]],
|
|
@@ -822,6 +836,7 @@ def launch(
|
|
|
822
836
|
memory=memory,
|
|
823
837
|
num_nodes=num_nodes,
|
|
824
838
|
max_restarts=max_restarts,
|
|
839
|
+
completions=completions,
|
|
825
840
|
image_id=image_id,
|
|
826
841
|
env=env,
|
|
827
842
|
disk_size=disk_size,
|
|
@@ -1686,6 +1701,7 @@ def serve_launch(
|
|
|
1686
1701
|
memory: Optional[str],
|
|
1687
1702
|
num_nodes: Optional[int],
|
|
1688
1703
|
max_restarts: Optional[int],
|
|
1704
|
+
completions: Optional[int],
|
|
1689
1705
|
image_id: Optional[str],
|
|
1690
1706
|
env_file: Optional[Dict[str, str]],
|
|
1691
1707
|
env: List[Tuple[str, str]],
|
|
@@ -1714,6 +1730,7 @@ def serve_launch(
|
|
|
1714
1730
|
memory=memory,
|
|
1715
1731
|
num_nodes=num_nodes,
|
|
1716
1732
|
max_restarts=max_restarts,
|
|
1733
|
+
completions=completions,
|
|
1717
1734
|
image_id=image_id,
|
|
1718
1735
|
env=env,
|
|
1719
1736
|
disk_size=disk_size,
|
|
@@ -387,7 +387,13 @@ class Resources:
|
|
|
387
387
|
|
|
388
388
|
def get_completions(self) -> Optional[int]:
|
|
389
389
|
value = self.job_config.get('completions')
|
|
390
|
-
|
|
390
|
+
if value is not None:
|
|
391
|
+
value = int(value)
|
|
392
|
+
if value <= 0:
|
|
393
|
+
with ux_utils.print_exception_no_traceback():
|
|
394
|
+
raise ValueError('completions must be a positive integer')
|
|
395
|
+
return value
|
|
396
|
+
return None
|
|
391
397
|
|
|
392
398
|
def get_max_restarts(self) -> Optional[int]:
|
|
393
399
|
value = self.job_config.get('max_restarts')
|
|
@@ -19,7 +19,7 @@ jobset:
|
|
|
19
19
|
annotations: {}
|
|
20
20
|
spec:
|
|
21
21
|
ttlSecondsAfterFinished: 31536000 # 1 year (365 days)
|
|
22
|
-
{% if max_restarts %}
|
|
22
|
+
{% if max_restarts is not none %}
|
|
23
23
|
failurePolicy:
|
|
24
24
|
maxRestarts: {{ max_restarts }}
|
|
25
25
|
{% endif %}
|
|
@@ -29,7 +29,11 @@ jobset:
|
|
|
29
29
|
spec:
|
|
30
30
|
ttlSecondsAfterFinished: 600 # 5 minutes
|
|
31
31
|
parallelism: {{ num_nodes }}
|
|
32
|
+
{% if completions %}
|
|
33
|
+
completions: {{ completions }}
|
|
34
|
+
{% else %}
|
|
32
35
|
completions: {{ num_nodes }}
|
|
36
|
+
{% endif %}
|
|
33
37
|
backoffLimit: 0
|
|
34
38
|
template: {}
|
|
35
39
|
podFailurePolicy:
|
|
@@ -161,6 +161,10 @@ kubernetes:
|
|
|
161
161
|
- name: git-ssh-secret
|
|
162
162
|
mountPath: /run/konduktor/git-ssh-secret
|
|
163
163
|
{% endif %}
|
|
164
|
+
{% if tailscale_secret %}
|
|
165
|
+
- name: tailscale-state
|
|
166
|
+
mountPath: /var/lib/tailscale
|
|
167
|
+
{% endif %}
|
|
164
168
|
command: ["bash", "-c"]
|
|
165
169
|
args:
|
|
166
170
|
- |
|
|
@@ -317,18 +321,19 @@ kubernetes:
|
|
|
317
321
|
export TS_HOSTNAME=$(echo "$POD_NAME" | sed 's/-[^-]*$//')
|
|
318
322
|
$(prefix_cmd) echo "TS_HOSTNAME=${TS_HOSTNAME}" >> /etc/environment
|
|
319
323
|
function InstallTailscale {
|
|
320
|
-
|
|
324
|
+
if ! command -v tailscale >/dev/null 2>&1; then
|
|
325
|
+
$(prefix_cmd) curl -fsSL https://tailscale.com/install.sh | DEBIAN_FRONTEND=noninteractive $(prefix_cmd) sh > ~/.konduktor/tmp/tailscale-install.log 2>&1
|
|
326
|
+
fi
|
|
327
|
+
if ! tailscale status >/dev/null 2>&1; then
|
|
321
328
|
$(prefix_cmd) mkdir -p /var/run/tailscale /var/cache/tailscale /var/lib/tailscale
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
$(prefix_cmd)
|
|
326
|
-
$(prefix_cmd) sleep 2
|
|
327
|
-
$(prefix_cmd) timeout 5 tailscale up --auth-key=${TS_AUTHKEY} --ssh --hostname=${TS_HOSTNAME} || echo "tailscale up failed retrying"
|
|
328
|
-
$(prefix_cmd) sleep 2
|
|
329
|
+
$(prefix_cmd) nohup tailscaled --tun=userspace-networking >~/.konduktor/tmp/tailscaled.log 2>&1 &
|
|
330
|
+
fi
|
|
331
|
+
until tailscale status >/dev/null 2>&1; do
|
|
332
|
+
$(prefix_cmd) tailscale up --auth-key=${TS_AUTHKEY} --ssh --hostname=${TS_HOSTNAME} --accept-dns=false || echo "tailscale up failed retrying"
|
|
329
333
|
done
|
|
330
334
|
$(prefix_cmd) echo "Tailscale is up"
|
|
331
335
|
$(prefix_cmd) tailscale status
|
|
336
|
+
$(prefix_cmd) tailscale netcheck
|
|
332
337
|
}
|
|
333
338
|
InstallTailscale | tee ~/.konduktor/tmp/tailscale-out.log
|
|
334
339
|
{% if konduktor_debug %}
|
|
@@ -413,6 +418,10 @@ kubernetes:
|
|
|
413
418
|
emptyDir:
|
|
414
419
|
medium: "Memory"
|
|
415
420
|
sizeLimit: 4Gi
|
|
421
|
+
{% if tailscale_secret %}
|
|
422
|
+
- name: tailscale-state
|
|
423
|
+
emptyDir: {}
|
|
424
|
+
{% endif %}
|
|
416
425
|
- name: sync
|
|
417
426
|
emptyDir: {}
|
|
418
427
|
{% for secret_type, secret_name in mount_secrets.items() %}
|
|
@@ -397,6 +397,8 @@ def tail_vicky_logs(
|
|
|
397
397
|
for line in response.iter_lines(decode_unicode=True):
|
|
398
398
|
if line:
|
|
399
399
|
payload = json.loads(line)
|
|
400
|
+
if 'missing _msg field' in payload['_msg']:
|
|
401
|
+
payload['_msg'] = ''
|
|
400
402
|
print(
|
|
401
403
|
f"{colorama.Fore.CYAN}{colorama.Style.BRIGHT} "
|
|
402
404
|
f"(job_name={job_name} worker_id={worker_id})"
|
{konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/LICENSE
RENAMED
|
File without changes
|
{konduktor_nightly-0.1.0.dev20250820104812 → konduktor_nightly-0.1.0.dev20250822104721}/README.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|