fix(orchestrator): не полагаться на мангление имени транзиентного юнита
systemd-run пропускает голое имя через unit_name_mangle_with_suffix, который сначала проверяет, не заканчивается ли оно уже известным типом юнита. Ключ операции — санитизированный ISO-timestamp вида `...T12-34-56.789Z`, то есть содержит точку, и корректность имени зависела бы от того, что `.789Z` случайно не совпало ни с одним типом systemd. Имя передаётся с явным суффиксом `.service`: systemd-run берёт его как есть и создаёт рядом одноимённый `.timer`, на который и рассчитывают снятие guard и status.
This commit is contained in:
@@ -447,7 +447,15 @@ async function armRollbackGuard(opId: string): Promise<void> {
|
|||||||
await writeText(scriptPath, buildAutoRollbackScript(opId), 0o700);
|
await writeText(scriptPath, buildAutoRollbackScript(opId), 0o700);
|
||||||
|
|
||||||
const unit = rollbackUnit(opId);
|
const unit = rollbackUnit(opId);
|
||||||
await runMutatingVisible`systemd-run --unit ${unit} --on-active=${FIREWALL_ROLLBACK_DEADLINE} /bin/sh ${scriptPath}`;
|
// Имя передаётся С суффиксом `.service`, а не голым.
|
||||||
|
//
|
||||||
|
// Голое имя systemd-run пропускает через unit_name_mangle_with_suffix, и тот
|
||||||
|
// сначала смотрит, не заканчивается ли оно уже известным типом юнита. Ключ
|
||||||
|
// операции — санитизированный ISO-timestamp вида `...T12-34-56.789Z`, то есть
|
||||||
|
// содержит точку, и корректность имени зависела бы от того, что `.789Z`
|
||||||
|
// случайно не совпало ни с одним типом. Явный суффикс убирает эту зависимость:
|
||||||
|
// systemd-run берёт имя как есть и создаёт рядом одноимённый `.timer`.
|
||||||
|
await runMutatingVisible`systemd-run --unit ${`${unit}.service`} --on-active=${FIREWALL_ROLLBACK_DEADLINE} /bin/sh ${scriptPath}`;
|
||||||
info(
|
info(
|
||||||
`firewall rollback guard armed: ${unit} fires in ${FIREWALL_ROLLBACK_DEADLINE} unless the operation disarms it`
|
`firewall rollback guard armed: ${unit} fires in ${FIREWALL_ROLLBACK_DEADLINE} unless the operation disarms it`
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -271,6 +271,16 @@ describe("disarm доказывает снятие guard'а, а не сообщ
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Имя транзиентного юнита передаётся с явным суффиксом. Голое имя systemd-run
|
||||||
|
* пропускает через мангling, который смотрит, не заканчивается ли оно уже
|
||||||
|
* известным типом юнита; ключ операции содержит точку (`...T12-34-56.789Z`),
|
||||||
|
* и корректность зависела бы от того, что `.789Z` ни с чем не совпало.
|
||||||
|
*/
|
||||||
|
test("имя юнита guard'а не зависит от мангления systemd", () => {
|
||||||
|
expect(firewallSource).toContain("systemd-run --unit ${`${unit}.service`}");
|
||||||
|
});
|
||||||
|
|
||||||
test("остановка guard'а стала стадией отката с отчётом", () => {
|
test("остановка guard'а стала стадией отката с отчётом", () => {
|
||||||
const rollback = firewallSource.slice(firewallSource.indexOf("export async function rollbackFirewallNow"));
|
const rollback = firewallSource.slice(firewallSource.indexOf("export async function rollbackFirewallNow"));
|
||||||
expect(rollback).toContain('name: "stop firewall rollback guard"');
|
expect(rollback).toContain('name: "stop firewall rollback guard"');
|
||||||
|
|||||||
Reference in New Issue
Block a user