- Навигация: выезжающее меню при узком экране (nav-mobile.js) - Журнал: карточки <620px, компактная пагинация, время в две строки <920px - Создание кластера: оверлей загрузки, инкрементальное обновление таблицы заданий - Документация: полноэкранный спиннер при загрузке и навигации - Главная: масштабирование CTA, статистика 2 колонки <520px, донаты перенос <710px - README: env.example, новые фичи UI, автор в конце файла - api_routes: маршрут /cluster-create, спиннеры, шаблоны; автор в конце - env.example: автор перенесён в конец файла
165 lines
6.0 KiB
HTML
165 lines
6.0 KiB
HTML
{# Создание кластера, журнал задания и последние задания.
|
||
Автор: Сергей Антропов — https://devops.org.ru #}
|
||
{% extends "base.html" %}
|
||
|
||
{% block body_extra_class %} dashboard-create-loading{% endblock %}
|
||
|
||
{% block body_attrs %}data-dashboard-mode="create"{% endblock %}
|
||
|
||
{% block footer %}
|
||
<div class="footer-inner">
|
||
<p class="footer-copyright">
|
||
© {{ app_title }} ·
|
||
<a href="https://devops.org.ru" target="_blank" rel="noopener">devops.org.ru</a>
|
||
</p>
|
||
</div>
|
||
{% endblock %}
|
||
|
||
{% block content %}
|
||
<div
|
||
id="create-page-loading-overlay"
|
||
class="page-loading-overlay"
|
||
role="status"
|
||
aria-live="polite"
|
||
aria-busy="true"
|
||
aria-label="Загрузка страницы создания кластера"
|
||
>
|
||
<div class="page-loading-backdrop" aria-hidden="true"></div>
|
||
<div class="page-loading-center">
|
||
<span class="spinner page-loading-spinner" aria-hidden="true"></span>
|
||
<span class="page-loading-label">Загрузка страницы…</span>
|
||
</div>
|
||
</div>
|
||
|
||
<section class="card hero-panel cluster-create-hero" aria-labelledby="create-hero-title">
|
||
<h1 class="page-title" id="create-hero-title">Создание кластера</h1>
|
||
<p class="muted page-lead">
|
||
Укажите имя, версию образа kindest/node и число worker-нод. Операция выполняется в фоне.<br>Ход смотрите в журнале ниже.
|
||
</p>
|
||
</section>
|
||
|
||
<section class="card create-cluster-card">
|
||
<h2 class="create-cluster-card__title">Новый кластер</h2>
|
||
<form id="form-create" novalidate>
|
||
<div class="create-form-grid">
|
||
<div class="create-form-field">
|
||
<label for="fld-name">Имя (a-z0-9-)</label>
|
||
<input
|
||
id="fld-name"
|
||
name="name"
|
||
required
|
||
pattern="[a-z0-9]([-a-z0-9]*[a-z0-9])?"
|
||
maxlength="63"
|
||
placeholder="dev"
|
||
autocomplete="off"
|
||
/>
|
||
</div>
|
||
|
||
<div class="create-form-field">
|
||
<label for="version-select">
|
||
<a
|
||
href="https://hub.docker.com/r/kindest/node/tags"
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
class="create-form-doc-link"
|
||
title="Список тегов kindest/node на Docker Hub (новое окно)"
|
||
>Тег образа</a><span class="create-form-doc-link__ext" aria-hidden="true">↗</span>
|
||
<span class="create-form-label-rest">
|
||
kindest/node — список или версия вручную ниже</span>
|
||
</label>
|
||
<select id="version-select" name="kubernetes_version_preset">
|
||
<option value="">— загрузить список —</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="create-form-field">
|
||
<label for="fld-workers">Worker-ноды (0–20)</label>
|
||
<input id="fld-workers" name="workers" type="number" min="0" max="20" step="1" value="2" />
|
||
</div>
|
||
|
||
<div class="create-form-field">
|
||
<label for="kubernetes_version">Версия Kubernetes / тег node</label>
|
||
<input
|
||
name="kubernetes_version"
|
||
id="kubernetes_version"
|
||
required
|
||
placeholder="1.29.4 или v1.29.4"
|
||
autocomplete="off"
|
||
/>
|
||
</div>
|
||
|
||
<div class="create-form-span">
|
||
<div class="row create-actions">
|
||
<button type="submit">Создать кластер</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="create-progress-wrap" class="create-progress-wrap hidden" aria-hidden="true">
|
||
<p class="create-progress-hint muted" id="create-progress-hint">
|
||
Идёт операция — шаг <code>kind create</code> может занять несколько минут при первом pull образов.
|
||
Ниже выводится журнал (скачивание образов и подъём нод).
|
||
</p>
|
||
<div
|
||
class="progress-track"
|
||
role="progressbar"
|
||
aria-valuemin="0"
|
||
aria-valuemax="100"
|
||
aria-valuenow="0"
|
||
aria-labelledby="create-progress-label"
|
||
id="create-progress-track"
|
||
>
|
||
<div class="progress-bar" id="create-progress-bar" style="width:0%"></div>
|
||
</div>
|
||
<p class="progress-label" id="create-progress-label">—</p>
|
||
<div class="job-log-panel-wrap">
|
||
<label for="job-log-panel" class="job-log-label muted">Журнал задания</label>
|
||
<pre
|
||
id="job-log-panel"
|
||
class="mono job-log-panel"
|
||
role="log"
|
||
aria-live="polite"
|
||
aria-relevant="additions"
|
||
></pre>
|
||
</div>
|
||
<button type="button" id="btn-cancel-create" class="btn-secondary">Отменить</button>
|
||
</div>
|
||
|
||
<p id="create-msg" class="msg" aria-live="polite"></p>
|
||
<details id="job-details" class="job-details hidden">
|
||
<summary>Технические детали (JSON)</summary>
|
||
<pre id="job-json" class="mono job-json-pre" tabindex="0"></pre>
|
||
</details>
|
||
</form>
|
||
</section>
|
||
|
||
<section class="card jobs-card">
|
||
<div class="row spread jobs-card-toolbar">
|
||
<h2 id="jobs-heading" class="jobs-card-title">Последние задания</h2>
|
||
<button type="button" id="btn-jobs-refresh" class="btn-secondary">Обновить</button>
|
||
</div>
|
||
<div class="table-wrap journal-table-wrap">
|
||
<table id="tbl-jobs" class="journal-table" aria-label="Последние задания из журналов кластеров">
|
||
<thead>
|
||
<tr>
|
||
<th scope="col">Завершено (UTC)</th>
|
||
<th scope="col">Кластер</th>
|
||
<th scope="col">Тип задания</th>
|
||
<th scope="col">Статус</th>
|
||
<th scope="col">Сообщение</th>
|
||
<th scope="col">Лог</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody></tbody>
|
||
</table>
|
||
</div>
|
||
<p id="jobs-msg" class="msg muted"></p>
|
||
</section>
|
||
|
||
{% include "partials/dashboard_modals.html" %}
|
||
{% endblock %}
|
||
|
||
{% block scripts %}
|
||
<script src="/static/js/dashboard.js" defer></script>
|
||
{% endblock %}
|