// 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 = 'Нет MQ-триггеров'; return; } tbody.innerHTML = items.map(t => ` ${escHtml(t.name)} ${escHtml(t.queue)} ${escHtml(t.functionName)} ${escHtml(t.sqsEndpoint || '')} ${t.ready ? '▶ Running' : '◼ Pending'} `).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,'"'); }