Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions projects/fournos_launcher/orchestration/submit.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import traceback
from datetime import datetime

from projects.core.dsl.utils.k8s import sanitize_k8s_name
from projects.core.library import config, env, run, vault
from projects.core.library.run_parallel import Parallel
from projects.fournos_launcher.orchestration import job_management, pr_args
Expand Down Expand Up @@ -159,6 +160,7 @@ def submit_job():
# Generate timestamp for parallel job names (shared across all parallel jobs)
timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
raw_name = f"forge-{project_name}-{timestamp}"
raw_name = sanitize_k8s_name(raw_name)

# Track failures and job names across parallel jobs
failure_lock = threading.Lock()
Expand All @@ -179,7 +181,7 @@ def submit_parallel_job(job_index, job_args_list):
parallel_display_name = f"{project_name} {args_str} (job {job_index})".strip()

# Create unique job name with timestamp and index
unique_job_name = f"{raw_name}-{job_index}"
unique_job_name = sanitize_k8s_name(f"{raw_name}-{job_index}")

try:
# Track the job name for cleanup (job gets submitted even if waiting fails)
Expand Down Expand Up @@ -240,7 +242,7 @@ def submit_parallel_job(job_index, job_args_list):

# Generate unique job name for single job
timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
single_job_name = f"forge-{project_name}-{timestamp}"
single_job_name = sanitize_k8s_name(f"forge-{project_name}-{timestamp}")

try:
submit_and_wait(
Expand Down
15 changes: 10 additions & 5 deletions projects/fournos_launcher/toolbox/submit_and_wait/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
task,
template,
)
from projects.core.dsl.utils.k8s import sanitize_k8s_name
from projects.core.dsl.utils.k8s import is_valid_k8s_name, sanitize_k8s_name
from projects.core.library import env as env_mod

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -133,14 +133,19 @@ def generate_job_name(args, ctx):
"""Generate job name if not provided and ensure K8s compatibility"""

if args.job_name:
# Sanitize user-provided job name
raw_name = args.job_name
# Validate that user-provided job name is already normalized
if not is_valid_k8s_name(args.job_name):
normalized_name = sanitize_k8s_name(args.job_name)
raise ValueError(
f"Job name '{args.job_name}' is not valid for Kubernetes. "
f"Please use the normalized name: '{normalized_name}'"
)
ctx.final_job_name = args.job_name
else:
# Generate and sanitize auto job name
timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
raw_name = f"forge-{args.project}-{timestamp}"

ctx.final_job_name = sanitize_k8s_name(raw_name)
ctx.final_job_name = sanitize_k8s_name(raw_name)

return f"Job name: {ctx.final_job_name}"

Expand Down
Loading