fix(build): гейт ACME описывал снятую архитектуру панели
Приёмка требовала, чтобы страница Hysteria содержала жёсткий список ACME DNS-провайдеров (cloudflare … vultr) и не содержала удалённого upstream namedotcom. Это имело смысл, пока панель ПРЕДЛАГАЛА выбор провайдера: список в UI был вторым экземпляром upstream-реестра и мог от него отстать — ровно так namedotcom и пришлось выпиливать вручную. После перевода страницы в read-only диагностику реестра нет и быть не должно: имя провайдера читается из фактического конфига и показывается как есть, поэтому новый upstream-провайдер отображается без правок панели. Возврат списка ради прохождения grep-а создал бы фиктивный реестр, существующий только для гейта. Гейт проверяет действующий контракт: провайдер приходит строкой и рисуется как значение, параметры DNS отдаются только именами, селектора на странице нет. Проверено положительно и на трёх нарушениях (провайдер перестал показываться, на странице появился селектор, тип стал перечислением) — гейт падает на каждом. Контрактный тест панели дополнен обратной проверкой: ни одно из восьми имён провайдеров не должно встречаться в исходнике страницы. Та же формулировка поправлена в матрице приёмки. Дополнительно прогнаны целиком все восемь функций приёмки, которым не нужен распакованный пакет: других устаревших утверждений нет.
This commit is contained in:
@@ -364,6 +364,23 @@ Hysteria-интеграции с официальной документацие
|
|||||||
тестом с настоящими сокетами, а гейт приёмки запрещает возврат `IsLoopback()`
|
тестом с настоящими сокетами, а гейт приёмки запрещает возврат `IsLoopback()`
|
||||||
и требует негативного случая в тестах.
|
и требует негативного случая в тестах.
|
||||||
|
|
||||||
|
### Исправлено — устаревшие утверждения приёмки
|
||||||
|
|
||||||
|
- **Гейт «frontend ACME registry matches current upstream» описывал снятую
|
||||||
|
архитектуру.** Он требовал, чтобы страница Hysteria содержала жёсткий список
|
||||||
|
ACME DNS-провайдеров (`cloudflare` … `vultr`) и не содержала удалённого
|
||||||
|
upstream `namedotcom`. Это имело смысл, пока панель ПРЕДЛАГАЛА выбор
|
||||||
|
провайдера: список в UI был вторым экземпляром upstream-реестра и мог от него
|
||||||
|
отстать. После перевода страницы в read-only диагностику реестра нет и быть не
|
||||||
|
должно — имя провайдера читается из фактического конфига и показывается как
|
||||||
|
есть, поэтому новый upstream-провайдер отображается без правок панели.
|
||||||
|
Возврат списка ради прохождения grep'а создал бы фиктивный реестр,
|
||||||
|
существующий только для гейта, поэтому исправлен гейт: он проверяет
|
||||||
|
действующий контракт (провайдер приходит строкой и рисуется как значение,
|
||||||
|
параметры DNS — только именами, селектора на странице нет). То же утверждение
|
||||||
|
поправлено в матрице приёмки, а контрактный тест панели теперь требует
|
||||||
|
ОТСУТСТВИЯ всех восьми имён провайдеров в исходнике страницы.
|
||||||
|
|
||||||
### Исправлено — зависимости frontend
|
### Исправлено — зависимости frontend
|
||||||
|
|
||||||
- **`browserslist@4.21.11` содержал high-advisory** (уязвимы `<= 4.28.6`) и
|
- **`browserslist@4.21.11` содержал high-advisory** (уязвимы `<= 4.28.6`) и
|
||||||
|
|||||||
@@ -726,6 +726,15 @@ credentials получает новую идентичность сессий».
|
|||||||
адрес auth-URL, имена параметров ACME DNS);
|
адрес auth-URL, имена параметров ACME DNS);
|
||||||
- отсутствующий файл конфига — отказ, а не пустой профиль.
|
- отсутствующий файл конфига — отказ, а не пустой профиль.
|
||||||
|
|
||||||
|
`tools/test/frontend-contract.test.ts` закрепляет ту же границу со стороны
|
||||||
|
панели: имя ACME DNS-провайдера показывается как фактическое значение профиля
|
||||||
|
(`text(profile.acme.dnsProvider)`), тип поля — обычная строка, а собственного
|
||||||
|
списка провайдеров в панели нет. Проверка перечисляет их поимённо
|
||||||
|
(`cloudflare`, `duckdns`, …, `namedotcom`) и требует, чтобы **ни один** не
|
||||||
|
встречался в исходнике страницы: реестр в UI был бы вторым экземпляром
|
||||||
|
upstream-списка, который умеет от него отстать — ровно так `namedotcom`
|
||||||
|
пришлось выпиливать вручную после его удаления в Hysteria 2.11.0.
|
||||||
|
|
||||||
`apps/service/hysteria2_export_test.go` дополнен якорями YAML: секрет за
|
`apps/service/hysteria2_export_test.go` дополнен якорями YAML: секрет за
|
||||||
`&anchor`/`*alias` вырезается и по ссылке, и в самом объявлении; URL с учётными
|
`&anchor`/`*alias` вырезается и по ссылке, и в самом объявлении; URL с учётными
|
||||||
данными за якорем — тоже; ссылка на составной узел редактируется целиком;
|
данными за якорем — тоже; ссылка на составной узел редактируется целиком;
|
||||||
|
|||||||
@@ -119,7 +119,7 @@
|
|||||||
28. экспорт не уничтожает современные и неизвестные upstream-поля
|
28. экспорт не уничтожает современные и неизвестные upstream-поля
|
||||||
29. экспорт не содержит секретов
|
29. экспорт не содержит секретов
|
||||||
30. frontend отображает Gecko
|
30. frontend отображает Gecko
|
||||||
31. `namedotcom` удалён, актуальные ACME-провайдеры отражены
|
31. панель показывает фактическое имя ACME DNS-провайдера из конфига и **не содержит** собственного списка провайдеров: страница Hysteria — read-only диагностика, выбирать провайдера она не предлагает, поэтому новый upstream-провайдер отображается без правок панели
|
||||||
32. документация нигде не утверждает, что Salamander — фиксированный инвариант
|
32. документация нигде не утверждает, что Salamander — фиксированный инвариант
|
||||||
33. документация не фиксирует конкретный номер версии как «текущую версию», а объясняет latest-stable build policy
|
33. документация не фиксирует конкретный номер версии как «текущую версию», а объясняет latest-stable build policy
|
||||||
34. форма создания пира содержит примеры значений и пояснения для полей «Пир», «Комментарий» и «Секрет»
|
34. форма создания пира содержит примеры значений и пояснения для полей «Пир», «Комментарий» и «Секрет»
|
||||||
|
|||||||
@@ -205,15 +205,41 @@ run_fix20_acceptance_subset() {
|
|||||||
grep -q 'GetRawHysteria2Config' apps/service/hysteria2_export.go \
|
grep -q 'GetRawHysteria2Config' apps/service/hysteria2_export.go \
|
||||||
|| fail "acceptance: export must read the raw YAML instead of the typed model"
|
|| fail "acceptance: export must read the raw YAML instead of the typed model"
|
||||||
|
|
||||||
log_step "Acceptance: frontend ACME registry matches current upstream"
|
log_step "Acceptance: frontend ACME diagnostics preserve upstream provider names"
|
||||||
# Ищем именно предлагаемое значение, а не упоминание в комментарии.
|
# Этот гейт проверял НЕ ТО, и его предмет исчез вместе с прежней страницей.
|
||||||
! grep -q '"namedotcom"' apps/frontend/src/views/hysteria/list/index.vue \
|
#
|
||||||
|| fail "acceptance: namedotcom was removed upstream in Hysteria 2.11.0 and must not be offered"
|
# Раньше он требовал, чтобы `apps/frontend/src/views/hysteria/list/index.vue`
|
||||||
local provider
|
# содержал жёстко заданный список ACME DNS-провайдеров
|
||||||
for provider in cloudflare duckdns gandi godaddy namecheap njalla porkbun vultr; do
|
#
|
||||||
grep -q "\"${provider}\"" apps/frontend/src/views/hysteria/list/index.vue \
|
# cloudflare duckdns gandi godaddy namecheap njalla porkbun vultr
|
||||||
|| fail "acceptance: ACME DNS provider ${provider} is missing from the UI registry"
|
#
|
||||||
done
|
# и не содержал `namedotcom`, удалённый upstream в Hysteria 2.11.0. Это имело
|
||||||
|
# смысл ровно до тех пор, пока панель ПРЕДЛАГАЛА оператору выбор провайдера:
|
||||||
|
# список в UI был вторым экземпляром upstream-реестра и мог от него отстать.
|
||||||
|
#
|
||||||
|
# Панель больше ничего не предлагает: конфигом владеет оркестратор, маршрутов
|
||||||
|
# записи в API нет, а страница Hysteria стала read-only диагностикой. Имя
|
||||||
|
# провайдера читается из фактического конфига и показывается как есть, поэтому
|
||||||
|
# реестра в UI нет и быть не должно — новый upstream-провайдер отображается
|
||||||
|
# без единой правки панели.
|
||||||
|
#
|
||||||
|
# Возврат старого списка ради прохождения этого grep'а создал бы фиктивный
|
||||||
|
# реестр, существующий только для гейта. Поэтому проверяется действующий
|
||||||
|
# контракт: провайдер приходит из профиля строкой и рисуется как значение.
|
||||||
|
local hysteria_page="apps/frontend/src/views/hysteria/list/index.vue"
|
||||||
|
local hysteria_types="apps/frontend/src/api/config/types.ts"
|
||||||
|
|
||||||
|
code_has "$hysteria_page" -F -- 'text(profile.acme.dnsProvider)' \
|
||||||
|
|| fail "acceptance: the panel must render the ACME DNS provider reported by the backend"
|
||||||
|
code_has "$hysteria_types" -E -- 'dnsProvider:[[:space:]]*string[[:space:]]*\|[[:space:]]*null' \
|
||||||
|
|| fail "acceptance: the ACME profile must carry the provider name as a generic string"
|
||||||
|
# Значения параметров DNS-провайдера — ключ от DNS-зоны, и read-only экрану
|
||||||
|
# они не нужны: показываются только имена.
|
||||||
|
code_has "$hysteria_types" -F -- 'dnsConfigKeys: string[]' \
|
||||||
|
|| fail "acceptance: the ACME DNS parameters must be exposed as key names only"
|
||||||
|
# Селектор провайдера означал бы возврат к «панель владеет конфигом».
|
||||||
|
! code_has "$hysteria_page" -F -- '<el-select' \
|
||||||
|
|| fail "acceptance: the Hysteria diagnostics page must remain read-only"
|
||||||
|
|
||||||
log_step "Acceptance: systemd unit production env"
|
log_step "Acceptance: systemd unit production env"
|
||||||
grep -q '^Environment=GIN_MODE=release$' "$package_dir/systemd/hy2xs-admin.service" || fail "acceptance: GIN_MODE=release missing"
|
grep -q '^Environment=GIN_MODE=release$' "$package_dir/systemd/hy2xs-admin.service" || fail "acceptance: GIN_MODE=release missing"
|
||||||
|
|||||||
@@ -601,6 +601,42 @@ describe("страница конфигурации Hysteria", () => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Имя ACME DNS-провайдера показывается как ФАКТИЧЕСКОЕ значение профиля.
|
||||||
|
//
|
||||||
|
// Прежняя страница несла жёсткий список провайдеров, то есть второй экземпляр
|
||||||
|
// upstream-реестра, который мог от него отстать: `namedotcom` пришлось
|
||||||
|
// выпиливать вручную после удаления в Hysteria 2.11.0. Панель больше ничего
|
||||||
|
// не предлагает — конфигом владеет оркестратор, — поэтому реестра в UI нет и
|
||||||
|
// быть не должно: новый upstream-провайдер отображается без правок панели.
|
||||||
|
test("ACME DNS provider показывается как фактическое значение профиля", () => {
|
||||||
|
const source = vueCodeOf(configPage());
|
||||||
|
const types = codeOf(configTypes());
|
||||||
|
|
||||||
|
expect(source).toContain("profile.acme.dnsProvider");
|
||||||
|
expect(source).toContain("text(profile.acme.dnsProvider)");
|
||||||
|
expect(types).toContain("dnsProvider: string | null");
|
||||||
|
|
||||||
|
// Реестр провайдеров в панели не возвращается ни под каким видом.
|
||||||
|
for (const provider of [
|
||||||
|
"cloudflare",
|
||||||
|
"duckdns",
|
||||||
|
"gandi",
|
||||||
|
"godaddy",
|
||||||
|
"namecheap",
|
||||||
|
"njalla",
|
||||||
|
"porkbun",
|
||||||
|
"vultr",
|
||||||
|
"namedotcom",
|
||||||
|
]) {
|
||||||
|
expect(source).not.toContain(`"${provider}"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Значения параметров DNS — ключ от DNS-зоны: read-only экран получает
|
||||||
|
// только их имена.
|
||||||
|
expect(types).toContain("dnsConfigKeys: string[]");
|
||||||
|
expect(types).not.toMatch(/dnsConfig:\s*(Record|\{)/);
|
||||||
|
});
|
||||||
|
|
||||||
// Компоненты генерического редактора удалены вместе со страницей: пока они
|
// Компоненты генерического редактора удалены вместе со страницей: пока они
|
||||||
// существуют, «универсальный редактор Hysteria» отрастает заново.
|
// существуют, «универсальный редактор Hysteria» отрастает заново.
|
||||||
test("компоненты генерического редактора удалены", () => {
|
test("компоненты генерического редактора удалены", () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user