Skip to content

Commit

Permalink
feat: add batch job timeout duration (#2824)
Browse files Browse the repository at this point in the history
resolves #2812
related PR: lablup/backend.ai#3066

Add batch job timeout duration to the session launcher.
User can select the time unit and input the timeout duration.

**How to test:**
> test endpoint: 10.82.230.49
1. Modify the support version of `batch-timeout` in `backend.ai-client-esm` for testing. (24.09)
2. Set session type to the batch.
3. Enable `Batch Job Timeout Duration`
  - eg
    start command: sleep 20 && echo \"hello world\"
    timeout: 3s

**Checklist:**
- [ ] Batch job timeout value remains after refreshing
- [ ] The 'Confirm and Launch' page has the same value if you set the 'Batch job timeout duration'.
- [ ] (API is not implemented yet) Create a new session with batch session timeout option.

**Screentshots:**
![image.png](https://graphite-user-uploaded-assets-prod.s3.amazonaws.com/2HueYSdFvL8pOB5mgrUQ/5adbf314-e521-4410-bed8-075124fad6c8.png)

![image.png](https://graphite-user-uploaded-assets-prod.s3.amazonaws.com/2HueYSdFvL8pOB5mgrUQ/c9dd0f12-695e-4960-ba98-9b6371c6a47a.png)

![image.png](https://graphite-user-uploaded-assets-prod.s3.amazonaws.com/2HueYSdFvL8pOB5mgrUQ/4075faa3-a61e-4ce3-833c-c858e6d6b75a.png)

![image.png](https://graphite-user-uploaded-assets-prod.s3.amazonaws.com/2HueYSdFvL8pOB5mgrUQ/600fd8cb-0040-43e4-b8fe-307730d292c0.png)

![image.png](https://graphite-user-uploaded-assets-prod.s3.amazonaws.com/2HueYSdFvL8pOB5mgrUQ/55116de0-e7eb-4ef7-8077-abde8ea73b3b.png)

**Checklist:**

- [ ] Documentation
- [ ] Test case: Verify timeout can be enabled/disabled
- [ ] Test case: Confirm time picker accepts valid duration formats
- [ ] Test case: Check default value initialization
- [ ] Test case: Validate timeout enforcement on batch sessions
  • Loading branch information
agatha197 committed Nov 14, 2024
1 parent 7265dfb commit b082f8a
Show file tree
Hide file tree
Showing 24 changed files with 674 additions and 194 deletions.
15 changes: 15 additions & 0 deletions react/src/helper/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import { Image } from '../components/ImageEnvironmentSelectFormItems';
import { EnvironmentImage } from '../components/ImageList';
import { useSuspendedBackendaiClient } from '../hooks';
import { SorterResult } from 'antd/es/table/interface';
import { Duration } from 'dayjs/plugin/duration';
import { TFunction } from 'i18next';
import _ from 'lodash';

export const newLineToBrElement = (
Expand Down Expand Up @@ -407,3 +409,16 @@ export function preserveDotStartCase(str: string) {
// Replace the placeholder back with periods
return startCased.replace(new RegExp(placeholder, 'g'), '.');
}

export function formatDuration(duration: Duration, t: TFunction) {
// We need to `t` function to translate the time unit in React render phase
return [
duration.weeks() ? `${duration.weeks()} ${t('time.week')}` : '',
duration.days() ? `${duration.days()} ${t('time.day')}` : '',
duration.hours() ? `${duration.hours()} ${t('time.hour')}` : '',
duration.minutes() ? `${duration.minutes()} ${t('time.min')}` : '',
duration.seconds() ? `${duration.seconds()} ${t('time.sec')}` : '',
]
.filter(Boolean)
.join(' ');
}
466 changes: 334 additions & 132 deletions react/src/pages/SessionLauncherPage.tsx

Large diffs are not rendered by default.

18 changes: 15 additions & 3 deletions resources/i18n/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@
"PreOpenPortConfigurationDone": "Vorgeöffnete Ports erfolgreich konfiguriert.",
"InfiniteTime": "Unendlich",
"ResetStartTime": "Bitte stellen Sie die Startzeit neu ein.",
"SessionStartTime": "Die Sitzung beginnt:",
"SessionStartTime": "Die Sitzung beginnt",
"SessionType": "Sitzungstyp",
"InferenceMode": "Inferenz",
"BatchMode": "Stapel",
Expand Down Expand Up @@ -289,7 +289,10 @@
"autoSelect": "Automatische Auswahl",
"DescSelectAgent": "Die auf der rechten Seite des Agenten angezeigten Ressourcen stellen die tatsächliche Menge der verfügbaren Ressourcen dar. \nDerzeit ist die Agentenauswahl nur in einer Single-Node-Single-Container-Umgebung verfügbar. \nDie Standardeinstellung ist die Agentenzuteilung durch den Scheduler.",
"AgentNode": "Agent",
"AutoSelect": "automatisch auswählen"
"AutoSelect": "automatisch auswählen",
"BatchJobTimeoutDuration": "Dauer des Batch-Job-Timeouts",
"BatchJobTimeoutDurationDesc": "Legen Sie die maximale Ausführungszeit für Batch-Jobs fest. \nDie Sitzung wird automatisch beendet, wenn die angegebene Zeit überschritten wird.",
"SetBatchJobTimeoutDuration": "Legen Sie die Zeitüberschreitungsdauer für Batch-Jobs fest"
},
"Preparing": "Vorbereitung...",
"PreparingSession": "Sitzung vorbereiten...",
Expand Down Expand Up @@ -1536,7 +1539,8 @@
"APINotSupported": "API wird nicht unterstützt. Erfordert die neueste Version des Backend.AI-Managers.",
"WrongAPIServerAddress": "Falsche API-Serveradresse.",
"ReachedResourceLimitPleaseContact": "Ihr Ressourcenlimit wurde erreicht. \nBitte wenden Sie sich an den Administrator.",
"InvalidUrl": "Es handelt sich nicht um eine gültige URL"
"InvalidUrl": "Es handelt sich nicht um eine gültige URL",
"AllowsPositiveNumberOnly": "Nur positive Zahlen zulassen."
},
"maxLength": {
"64chars": "(maximal 64 Zeichen)",
Expand Down Expand Up @@ -1757,5 +1761,13 @@
"SelectEndpoint": "Wählen Sie Endpunkt aus",
"SyncInput": "Eingang synchronisieren",
"CompareWithOtherModels": "Vergleichen Sie mit anderen Modellen"
},
"time": {
"ms": "ms",
"sec": "Sek",
"min": "min",
"hour": "Stunde",
"day": "day",
"week": "Woche"
}
}
18 changes: 15 additions & 3 deletions resources/i18n/el.json
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@
"PreOpenPortConfigurationDone": "Οι προ-ανοίγουσες θύρες διαμορφώθηκαν με επιτυχία.",
"InfiniteTime": "Άπειρο",
"ResetStartTime": "Παρακαλώ επαναφέρετε την ώρα έναρξης.",
"SessionStartTime": "Έναρξη συνεδρίας:",
"SessionStartTime": "Έναρξη συνεδρίας",
"SessionType": "Τύπος συνεδρίας",
"InferenceMode": "Συμπεράσματα",
"BatchMode": "Παρτίδα",
Expand Down Expand Up @@ -289,7 +289,10 @@
"autoSelect": "Αυτόματη επιλογή",
"DescSelectAgent": "Οι πόροι που εμφανίζονται στη δεξιά πλευρά του πράκτορα αντιπροσωπεύουν την πραγματική ποσότητα των διαθέσιμων πόρων. \nΠρος το παρόν, η επιλογή πράκτορα είναι διαθέσιμη μόνο σε περιβάλλον ενός κοντέινερ ενός κόμβου. \nΗ προεπιλεγμένη ρύθμιση είναι η κατανομή πράκτορα από τον προγραμματιστή.",
"AgentNode": "Μέσο",
"AutoSelect": "αυτόματη επιλογή"
"AutoSelect": "αυτόματη επιλογή",
"BatchJobTimeoutDuration": "Διάρκεια χρονικού ορίου λήξης παρτίδας εργασίας",
"BatchJobTimeoutDurationDesc": "Ορίστε τον μέγιστο χρόνο εκτέλεσης για εργασίες παρτίδας. \nΗ συνεδρία θα τερματιστεί αυτόματα εάν ξεπεραστεί ο καθορισμένος χρόνος.",
"SetBatchJobTimeoutDuration": "Ορίστε τη διάρκεια του χρονικού ορίου λήξης της παρτίδας εργασίας"
},
"Preparing": "Προετοιμασία ...",
"PreparingSession": "Προετοιμασία συνεδρίας ...",
Expand Down Expand Up @@ -1536,7 +1539,8 @@
"APINotSupported": "Το API δεν υποστηρίζεται. Απαιτείται η τελευταία έκδοση του διαχειριστή Backend.AI.",
"WrongAPIServerAddress": "Λάθος διεύθυνση διακομιστή API.",
"ReachedResourceLimitPleaseContact": "Φτάσατε το όριο των πόρων σας. \nΕπικοινωνήστε με τον διαχειριστή.",
"InvalidUrl": "Δεν είναι έγκυρη διεύθυνση URL"
"InvalidUrl": "Δεν είναι έγκυρη διεύθυνση URL",
"AllowsPositiveNumberOnly": "Να επιτρέπεται μόνο θετικός αριθμός."
},
"maxLength": {
"64chars": "(έως 64 χαρακτήρες)",
Expand Down Expand Up @@ -1757,5 +1761,13 @@
"SelectEndpoint": "Επιλέξτε Τελικό σημείο",
"SyncInput": "Συγχρονισμός εισόδου",
"CompareWithOtherModels": "Συγκρίνετε με άλλα μοντέλα"
},
"time": {
"ms": "ms",
"sec": "δευτ",
"min": "min",
"hour": "ώρα",
"day": "day",
"week": "εβδομάδα"
}
}
18 changes: 15 additions & 3 deletions resources/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@
"BatchModeConfig": "Batch mode Configuration",
"ScheduleTime": "Schedule time (optional)",
"StartUpCommand": "Startup Command",
"SessionStartTime": "Session Starts: ",
"SessionStartTime": "Session Starts",
"ResetStartTime": "Please reset the start time.",
"InfiniteTime": "Infinite",
"SetEnvironmentVariable": "Environment Variable (optional)",
Expand Down Expand Up @@ -303,7 +303,10 @@
"autoSelect": "Auto Select",
"DescSelectAgent": "The resources displayed on the right side of the agent represent the actual amount of available resources. Currently, agent selection is only available in a single-node single-container environment. The default setting is agent allocation by the scheduler.",
"AgentNode": "Agent ",
"AutoSelect": "auto-select"
"AutoSelect": "auto-select",
"BatchJobTimeoutDuration": "Batch Job Timeout Duration",
"BatchJobTimeoutDurationDesc": "Set the maximum execution time for batch jobs. The session will automatically terminate if the specified time is exceeded.",
"SetBatchJobTimeoutDuration": "Set batch job timeout duration"
},
"Preparing": "Preparing...",
"PreparingSession": "Preparing session...",
Expand Down Expand Up @@ -1668,7 +1671,8 @@
"APINotSupported": "API not supported. Requires latest version of Backend.AI manager.",
"ErrorFetchingExternalContent": "Error fetching external content:",
"ReachedResourceLimitPleaseContact": "Reached your resource limit. Please contact the administrator.",
"InvalidUrl": "It is not a valid URL"
"InvalidUrl": "It is not a valid URL",
"AllowsPositiveNumberOnly": "Allow positive number only."
},
"maxLength": {
"64chars": "(maximum 64 chars)",
Expand Down Expand Up @@ -1762,5 +1766,13 @@
"DeleteChattingSessionDescription": "You are about to delete this topic. Once deleted, it cannot be recovered. Please proceed with caution.",
"SyncInput": "Sync input",
"CompareWithOtherModels": "Compare with other models"
},
"time": {
"ms": "ms",
"sec": "sec",
"min": "min",
"hour": "hour",
"day": "day",
"week": "week"
}
}
18 changes: 15 additions & 3 deletions resources/i18n/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@
"UserNameAlreadyExist": "El nombre de usuario ya existe. No se puede duplicar.",
"VirtualFolderAlreadyExist": "Ya existe una carpeta virtual con el mismo nombre. Elimine su propia carpeta o rechace la invitación.",
"ReachedResourceLimitPleaseContact": "Alcanzó su límite de recursos. \nPor favor contacte al administrador.",
"InvalidUrl": "No es una URL válida"
"InvalidUrl": "No es una URL válida",
"AllowsPositiveNumberOnly": "Permitir solo números positivos."
},
"DownloadSSHKey": "Descargar clave SSH",
"ErrorBoundary": {
Expand Down Expand Up @@ -1256,7 +1257,7 @@
"SessionAlreadyExists": "El nombre de la sesión ya existe",
"SessionNameAllowCondition": "El nombre de la sesión debe tener de 4 a 64 letras/números sin espacios en blanco.",
"SessionNameOptional": "Nombre de la sesión (opcional)",
"SessionStartTime": "Comienza la sesión:",
"SessionStartTime": "Comienza la sesión",
"SessionType": "Tipo de sesión",
"Sessions": "Sesiones",
"SetEnvironmentVariable": "Variable de entorno (opcional)",
Expand Down Expand Up @@ -1325,7 +1326,10 @@
"autoSelect": "Selección automática",
"DescSelectAgent": "Los recursos que se muestran en el lado derecho del agente representan la cantidad real de recursos disponibles. \nActualmente, la selección de agentes solo está disponible en un entorno de un solo nodo y un solo contenedor. \nLa configuración predeterminada es la asignación de agentes por parte del programador.",
"AgentNode": "Agente",
"AutoSelect": "selección automática"
"AutoSelect": "selección automática",
"BatchJobTimeoutDuration": "Duración del tiempo de espera del trabajo por lotes",
"BatchJobTimeoutDurationDesc": "Establezca el tiempo máximo de ejecución para trabajos por lotes. \nLa sesión finalizará automáticamente si se excede el tiempo especificado.",
"SetBatchJobTimeoutDuration": "Establecer la duración del tiempo de espera del trabajo por lotes"
},
"ExpiresAfter": "Tiempo restante",
"CPU": "CPU",
Expand Down Expand Up @@ -1759,5 +1763,13 @@
"SelectEndpoint": "Seleccionar punto final",
"SyncInput": "Entrada de sincronización",
"CompareWithOtherModels": "Comparar con otros modelos"
},
"time": {
"ms": "ms",
"sec": "segundo",
"min": "min",
"hour": "hora",
"day": "day",
"week": "semana"
}
}
18 changes: 15 additions & 3 deletions resources/i18n/fi.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@
"UserNameAlreadyExist": "Käyttäjätunnus on jo olemassa. Sitä ei voi kopioida.",
"VirtualFolderAlreadyExist": "Samanniminen virtuaalikansio on jo olemassa. Poista oma kansiosi tai hylkää kutsu.",
"ReachedResourceLimitPleaseContact": "Resurssiraja saavutettu. \nOta yhteyttä ylläpitäjään.",
"InvalidUrl": "Se ei ole kelvollinen URL-osoite"
"InvalidUrl": "Se ei ole kelvollinen URL-osoite",
"AllowsPositiveNumberOnly": "Salli vain positiivinen luku."
},
"DownloadSSHKey": "Lataa SSH-avain",
"ErrorBoundary": {
Expand Down Expand Up @@ -1253,7 +1254,7 @@
"SessionAlreadyExists": "Istunnon nimi on jo olemassa",
"SessionNameAllowCondition": "Istunnon nimessä tulisi olla 4-64 aakkosta/numeroa ilman välilyöntejä.",
"SessionNameOptional": "Istunnon nimi (valinnainen)",
"SessionStartTime": "Istunto alkaa:",
"SessionStartTime": "Istunto alkaa",
"SessionType": "Istunnon tyyppi",
"Sessions": "Istunnot",
"SetEnvironmentVariable": "Ympäristömuuttuja (valinnainen)",
Expand Down Expand Up @@ -1322,7 +1323,10 @@
"autoSelect": "Automaattinen valinta",
"DescSelectAgent": "Agentin oikealla puolella näkyvät resurssit edustavat käytettävissä olevien resurssien todellista määrää. \nTällä hetkellä agentin valinta on käytettävissä vain yhden solmun yhden säilön ympäristössä. \nOletusasetus on ajastimen suorittama agentin allokointi.",
"AgentNode": "Agentti",
"AutoSelect": "automaattinen valinta"
"AutoSelect": "automaattinen valinta",
"BatchJobTimeoutDuration": "Erätyön aikakatkaisun kesto",
"BatchJobTimeoutDurationDesc": "Aseta erätöiden enimmäissuoritusaika. \nIstunto päättyy automaattisesti, jos määritetty aika ylittyy.",
"SetBatchJobTimeoutDuration": "Aseta erätyön aikakatkaisun kesto"
},
"ExpiresAfter": "Jäljellä oleva aika",
"CPU": "CPU",
Expand Down Expand Up @@ -1755,5 +1759,13 @@
"SelectModel": "Valitse Malli",
"SyncInput": "Synkronoi sisääntulo",
"CompareWithOtherModels": "Vertaa muihin malleihin"
},
"time": {
"ms": "ms",
"sec": "sek",
"min": "min",
"hour": "tunnin",
"day": "day",
"week": "viikko"
}
}
18 changes: 15 additions & 3 deletions resources/i18n/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@
"DescFolderAlias": "</p><p>Si vous remplissez ce champ, le nom du dossier sera remplacé par un alias lors du montage.</p><p>Les chemins absolus seront montés dans '/', les autres sont des sous-chemins de /home/work</p><p>N'utilisez pas d'alias comme pour les dossiers système.</p><p>Vérifiez le chemin final qui est imprimé dans 'Dossiers montés' ci-dessous.</p><p>Si vous voulez voir cette fenêtre à nouveau, cliquez sur l'icône à côté de 'Chemin & Alias'</p>",
"InfiniteTime": "Infini",
"ResetStartTime": "Veuillez réinitialiser l'heure de début.",
"SessionStartTime": "Début de la session :",
"SessionStartTime": "Début de la session",
"SessionType": "Type de session",
"BatchMode": "Lot",
"InteractiveMode": "Interactif",
Expand Down Expand Up @@ -289,7 +289,10 @@
"autoSelect": "Sélection automatique",
"DescSelectAgent": "Les ressources affichées sur le côté droit de l'agent représentent la quantité réelle de ressources disponibles. \nActuellement, la sélection d'agents n'est disponible que dans un environnement à nœud unique et à conteneur unique. \nLe paramètre par défaut est l'allocation des agents par le planificateur.",
"AgentNode": "Agent",
"AutoSelect": "sélection automatique"
"AutoSelect": "sélection automatique",
"BatchJobTimeoutDuration": "Durée d'expiration du travail par lots",
"BatchJobTimeoutDurationDesc": "Définissez la durée d'exécution maximale des tâches par lots. \nLa session se terminera automatiquement si la durée spécifiée est dépassée.",
"SetBatchJobTimeoutDuration": "Définir la durée d'expiration du travail par lots"
},
"Preparing": "En train de préparer...",
"PreparingSession": "Séance de préparation...",
Expand Down Expand Up @@ -1536,7 +1539,8 @@
"APINotSupported": "L'API n'est pas prise en charge. Nécessite la dernière version du gestionnaire Backend.AI.",
"WrongAPIServerAddress": "Mauvaise adresse du serveur API.",
"ReachedResourceLimitPleaseContact": "Vous avez atteint votre limite de ressources. \nVeuillez contacter l'administrateur.",
"InvalidUrl": "Ce n'est pas une URL valide"
"InvalidUrl": "Ce n'est pas une URL valide",
"AllowsPositiveNumberOnly": "Autoriser uniquement les nombres positifs."
},
"maxLength": {
"64chars": "(maximum 64 caractères)",
Expand Down Expand Up @@ -1757,5 +1761,13 @@
"SelectEndpoint": "Sélectionnez le point de terminaison",
"SyncInput": "Entrée de synchronisation",
"CompareWithOtherModels": "Comparez avec d'autres modèles"
},
"time": {
"ms": "ms",
"sec": "seconde",
"min": "min",
"hour": "heure",
"day": "day",
"week": "semaine"
}
}
18 changes: 15 additions & 3 deletions resources/i18n/id.json
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@
"DescFolderAlias": "<p>Jika Anda mengisi input ini, nama folder akan berubah menjadi alias saat dipasang.</p> <p>Path absolut akan dipasang di '/', yang lainnya adalah sub path dari /home/work</p> <p>Jangan gunakan alias yang sama dengan folder sistem.</p> <p>Silakan periksa path akhir yang dicetak di 'Mounted folder' di bawah ini.</p> <p>Jika Anda ingin melihat jendela ini lagi, klik ikon di sebelah 'Path & Alias'.",
"InfiniteTime": "Tak terbatas",
"ResetStartTime": "Atur ulang waktu mulai.",
"SessionStartTime": "Sesi dimulai:",
"SessionStartTime": "Sesi dimulai",
"SessionType": "Jenis Sesi",
"BatchMode": "Batch",
"InteractiveMode": "Interaktif",
Expand Down Expand Up @@ -290,7 +290,10 @@
"autoSelect": "Pilih Otomatis",
"DescSelectAgent": "Sumber daya yang ditampilkan di sisi kanan agen mewakili jumlah sebenarnya sumber daya yang tersedia. \nSaat ini, pemilihan agen hanya tersedia di lingkungan kontainer tunggal node tunggal. \nPengaturan defaultnya adalah alokasi agen oleh penjadwal.",
"AgentNode": "Agen",
"AutoSelect": "pilih otomatis"
"AutoSelect": "pilih otomatis",
"BatchJobTimeoutDuration": "Durasi Batas Waktu Tugas Batch",
"BatchJobTimeoutDurationDesc": "Tetapkan waktu eksekusi maksimum untuk pekerjaan batch. \nSesi akan otomatis berakhir jika waktu yang ditentukan terlampaui.",
"SetBatchJobTimeoutDuration": "Tetapkan durasi batas waktu tugas batch"
},
"Preparing": "Mempersiapkan...",
"PreparingSession": "Mempersiapkan sesi...",
Expand Down Expand Up @@ -1537,7 +1540,8 @@
"APINotSupported": "API tidak didukung. Memerlukan versi terbaru dari manajer Backend.AI.",
"WrongAPIServerAddress": "Alamat server API salah.",
"ReachedResourceLimitPleaseContact": "Mencapai batas sumber daya Anda. \nSilakan hubungi administrator.",
"InvalidUrl": "Ini bukan URL yang valid"
"InvalidUrl": "Ini bukan URL yang valid",
"AllowsPositiveNumberOnly": "Izinkan angka positif saja."
},
"maxLength": {
"64chars": "(maksimum 64 karakter)",
Expand Down Expand Up @@ -1757,5 +1761,13 @@
"SelectEndpoint": "Pilih Titik Akhir",
"SyncInput": "Sinkronkan masukan",
"CompareWithOtherModels": "Bandingkan dengan model lain"
},
"time": {
"ms": "ms",
"sec": "detik",
"min": "min",
"hour": "jam",
"day": "day",
"week": "pekan"
}
}
Loading

0 comments on commit b082f8a

Please sign in to comment.