104 lines
4.4 KiB
JavaScript
104 lines
4.4 KiB
JavaScript
// mq.js — MQ-триггеры (SQS → Fission function)
|
|
// Архитектура: Console создаёт K8s Deployment + Secret (sqs-consumer) в namespace пользователя.
|
|
// sqs-consumer поллит SQS очередь → HTTP POST в Fission-функцию → DeleteMessage.
|
|
// Backend: POST /console/api/mqtriggers, DELETE /console/api/mqtriggers/{name}
|
|
// v1.3.88
|
|
|
|
// ── Загрузка и отрисовка ────────────────────────────────────────────
|
|
|
|
async function loadMQTriggers() {
|
|
try {
|
|
const data = await apiFetch('/console/api/mqtriggers');
|
|
renderMQTable(data.items || []);
|
|
const cnt = document.getElementById('mq-count');
|
|
if (cnt) cnt.textContent = (data.items || []).length;
|
|
} catch (e) {
|
|
renderMQTable([]);
|
|
const cnt = document.getElementById('mq-count');
|
|
if (cnt) cnt.textContent = '0';
|
|
}
|
|
}
|
|
|
|
function renderMQTable(items) {
|
|
const tbody = document.getElementById('mq-rows');
|
|
if (!tbody) return;
|
|
if (!items.length) {
|
|
tbody.innerHTML = '<tr><td colspan="6" style="color:var(--fg-muted,#888);text-align:center;">Нет MQ-триггеров</td></tr>';
|
|
return;
|
|
}
|
|
tbody.innerHTML = items.map(t => `
|
|
<tr>
|
|
<td>${escHtml(t.name)}</td>
|
|
<td>${escHtml(t.queue)}</td>
|
|
<td>${escHtml(t.functionName)}</td>
|
|
<td style="font-size:0.8em;color:var(--fg-muted,#aaa);">${escHtml(t.sqsEndpoint || '')}</td>
|
|
<td><span style="color:${t.ready ? '#4a4' : '#a44'}">${t.ready ? '▶ Running' : '◼ Pending'}</span></td>
|
|
<td>
|
|
<button class="btn ghost small" onclick="deleteMQTrigger('${escHtml(t.name)}')">Удалить</button>
|
|
</td>
|
|
</tr>
|
|
`).join('');
|
|
}
|
|
|
|
// ── Создание ─────────────────────────────────────────────────────────
|
|
|
|
function openCreateMQ() {
|
|
document.getElementById('mq-name').value = '';
|
|
document.getElementById('mq-fn').value = '';
|
|
document.getElementById('mq-queue').value = '';
|
|
document.getElementById('mq-endpoint').value = 'http://shared-sqs.shared-sqs.svc.cluster.local:4100';
|
|
document.getElementById('mq-access-key').value = '';
|
|
document.getElementById('mq-secret-key').value = '';
|
|
document.getElementById('mq-create-error').textContent = '';
|
|
document.getElementById('mq-create-modal').style.display = 'flex';
|
|
}
|
|
|
|
function closeMQCreate() {
|
|
document.getElementById('mq-create-modal').style.display = 'none';
|
|
}
|
|
|
|
async function submitCreateMQ() {
|
|
const name = document.getElementById('mq-name').value.trim();
|
|
const fnName = document.getElementById('mq-fn').value.trim();
|
|
const queue = document.getElementById('mq-queue').value.trim();
|
|
const endpoint = document.getElementById('mq-endpoint').value.trim();
|
|
const accessKey = document.getElementById('mq-access-key').value.trim();
|
|
const secretKey = document.getElementById('mq-secret-key').value.trim();
|
|
const errEl = document.getElementById('mq-create-error');
|
|
|
|
if (!name || !fnName || !queue || !accessKey || !secretKey) {
|
|
errEl.textContent = 'Заполните все поля';
|
|
return;
|
|
}
|
|
|
|
errEl.textContent = '';
|
|
try {
|
|
await apiFetch('/console/api/mqtriggers', {
|
|
method: 'POST',
|
|
body: JSON.stringify({ name, functionName: fnName, queue, sqsEndpoint: endpoint, accessKey, secretKey })
|
|
});
|
|
closeMQCreate();
|
|
await loadMQTriggers();
|
|
} catch (e) {
|
|
errEl.textContent = e.message || 'Ошибка создания';
|
|
}
|
|
}
|
|
|
|
// ── Удаление ─────────────────────────────────────────────────────────
|
|
|
|
async function deleteMQTrigger(name) {
|
|
if (!confirm(`Удалить MQ-триггер "${name}"?`)) return;
|
|
try {
|
|
await apiFetch(`/console/api/mqtriggers/${encodeURIComponent(name)}`, { method: 'DELETE' });
|
|
await loadMQTriggers();
|
|
} catch (e) {
|
|
alert('Ошибка удаления: ' + (e.message || e));
|
|
}
|
|
}
|
|
|
|
// ── Утилита ──────────────────────────────────────────────────────────
|
|
|
|
function escHtml(s) {
|
|
return String(s).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"');
|
|
}
|