{% if backends %}
{% for name, backend in backends.items() %}
{{ name }} ({{ backend.backend_type }})
Log
{% if not backend.enabled %} Disabled {% elif backend.status.connected %} {% if backend.status.cpus_user is not none and backend.status.cpus_idle is not none %} Using {{ backend.status.cpus_user }} CPUs in {{ backend_job_counts.get(name, 0) }} jobs, {{ backend.status.cpus_idle }} available {% else %} {{ backend_job_counts.get(name, 0) }} jobs {% endif %} {% if backend.status.disk_avail_bytes is not none and backend.status.disk_total_bytes %} {% set disk_used_pct = ((backend.status.disk_total_bytes - backend.status.disk_avail_bytes) * 100 / backend.status.disk_total_bytes) | round(0, 'floor') | int %} {{ backend.status.disk_avail_bytes | disk_bytes }} free ({{ disk_used_pct }}% used) {% endif %} {% if backend.status.last_poll_duration_ms is not none %} {{ backend.status.last_poll_duration_ms }}ms {% endif %} {% if backend.status.last_poll %} {% endif %} {% else %} Disconnected {% if backend.status.last_poll_duration_ms is not none %} {{ backend.status.last_poll_duration_ms }}ms {% endif %} {% endif %}
{% if backend.enabled and backend.status.error %}
{{ backend.status.error }}
{% endif %} {% if backend.enabled and backend.status.connected and backend.status.cluster_info and backend.status.cluster_info.user_quota %} {% set q = backend.status.cluster_info.user_quota %}
Your usage: {% if q.jobs_used is not none or q.jobs_max is not none %} = q.jobs_max %}class="text-red-600"{% endif %}> jobs {{ q.jobs_used if q.jobs_used is not none else '?' }}{% if q.jobs_max %}/{{ q.jobs_max }}{% endif %} {% endif %} {% if q.cpus_used is not none or q.cpus_max is not none %} cpus {{ q.cpus_used if q.cpus_used is not none else '?' }}{% if q.cpus_max %}/{{ q.cpus_max }}{% endif %} {% endif %} {% if q.gpus_used is not none and q.gpus_used > 0 or q.gpus_max is not none %} gpus {{ q.gpus_used if q.gpus_used is not none else '?' }}{% if q.gpus_max %}/{{ q.gpus_max }}{% endif %} {% endif %} {% if q.fair_share is not none %} fair-share {{ '%.2f'|format(q.fair_share) }} {% endif %} {% if q.account %} account {{ q.account }} {% endif %}
{% endif %} {% if backend.enabled and backend.status.connected and backend.status.cluster_info %} {% set ci = backend.status.cluster_info %} {% set has_gpus = ci.partitions|selectattr('gpus_total', 'gt', 0)|list|length > 0 %} {% if ci.partitions|length > 1 or ci.pending_reasons or has_gpus %}
Partition details {% if ci.pending_reasons %} • {{ ci.pending_reasons.values()|sum }} pending {% endif %} {% set cpu_avail = ci.partitions | selectattr('cpus_free_max_node', 'gt', 0) | sort(attribute='cpus_free_max_node', reverse=true) | list %} {% set gpu_avail = ci.partitions | selectattr('gpus_schedulable', 'gt', 0) | sort(attribute='gpus_schedulable', reverse=true) | list %}
{% if cpu_avail %} Easiest to start now: {{ cpu_avail[0].name }} (up to {{ cpu_avail[0].cpus_free_max_node }} CPU{% if cpu_avail[0].mem_free_max_node_mb %}/{{ (cpu_avail[0].mem_free_max_node_mb // 1024) }}G{% endif %} on one node) {% else %} No partition can start a job immediately — every node is full or unavailable, so jobs will queue. {% endif %} {% if has_gpus %} {% if gpu_avail %} · GPUs now: {{ gpu_avail[0].name }} ({{ gpu_avail[0].gpus_schedulable }} {{ gpu_avail[0].gpu_types or 'gpu' }}) {% else %} · No GPUs schedulable right now (idle GPUs are on CPU-saturated nodes) {% endif %} {% endif %}
{% if has_gpus %} {% endif %} {% for p in ci.partitions %} {% if has_gpus %} {% endif %} {% endfor %}
Partition Idle/Total CPUs Free now (1 node)GPUs (now/idle/total)Nodes Mem/Node Timelimit Features
{{ p.name }}{% if p.is_default %}*{% endif %} {% if p.state and p.state != 'up' %}({{ p.state }}){% endif %} {{ p.cpus_idle }} / {{ p.cpus_total }} {% if p.cpus_free_max_node %}{{ p.cpus_free_max_node }}c{% if p.mem_free_max_node_mb %}/{{ (p.mem_free_max_node_mb // 1024) }}G{% endif %}{% else %}full{% endif %} {% if p.gpus_total %}{{ p.gpus_schedulable }} / {{ p.gpus_idle }} / {{ p.gpus_total }}{% if p.gpu_types %}{{ p.gpu_types }}{% endif %}{% else %}—{% endif %} {{ p.nodes_total }} {% if p.mem_per_node_mb %}{{ (p.mem_per_node_mb // 1024) }}G{% else %}—{% endif %} {{ p.timelimit or '—' }} {{ p.features or '—' }}
{% if ci.pending_reasons %}
Pending jobs by reason: {% for reason, count in ci.pending_reasons.items()|sort(attribute=1, reverse=true) %} {{ reason }} × {{ count }} {% endfor %}
{% endif %}
{% endif %} {% endif %} {% endfor %}
{% else %}

No backends configured

{% endif %}