47 lines
2.6 KiB
SQL
47 lines
2.6 KiB
SQL
-- Placement is not config (novox/hq ADR 0348 clause 11, issue 651).
|
|
--
|
|
-- Where a module's directories are on a machine (`places`), where the operator's data it reads is
|
|
-- (`accesses`) and which found networks a taken container keeps (`networks`) were kept as keys of a
|
|
-- settings layer. They are facts of an assignment that the controller decides, never config values, and
|
|
-- the config values are leaving for the mesh-config module (ADR 0348 clause 9) while placement stays with
|
|
-- the controller. So they get a table of their own beside the assignment, and every settings layer's
|
|
-- placement keys move into it, unchanged.
|
|
--
|
|
-- Scoped exactly as the layer they came from: one machine's, or the whole mesh's (node null) for a
|
|
-- module's every assignment, which is how a mesh-wide `places` or `accesses` layer composes today. The
|
|
-- composer reads placement from here only; the `settings` verb still takes the three keys and routes
|
|
-- them here, so nothing a person types changes.
|
|
create table placement (
|
|
node uuid references node(id) on delete cascade,
|
|
module text not null references module(name) on delete cascade,
|
|
-- Only `places`, `accesses` and `networks`, as the settings layer held them.
|
|
values jsonb not null,
|
|
set_at timestamptz not null default now(),
|
|
set_by text
|
|
);
|
|
create unique index placement_for_the_mesh on placement (module) where node is null;
|
|
create unique index placement_for_a_node on placement (node, module) where node is not null;
|
|
|
|
-- Why a layer went into the history, beside how (`replaced_by`): said for a layer this migration moved.
|
|
alter table settings_history add column why text;
|
|
|
|
-- Each layer that held a placement key is kept whole in the history first, as a `settings history` reads it.
|
|
insert into settings_history (node, module, values, set_at, replaced_by, set_by, why)
|
|
select node, module, values, set_at, 'moved', set_by, 'moved to placement, ADR 0348 clause 11'
|
|
from settings
|
|
where values ?| array['places', 'accesses', 'networks'];
|
|
|
|
insert into placement (node, module, values, set_at, set_by)
|
|
select node, module,
|
|
(select jsonb_object_agg(e.key, e.value) from jsonb_each(values) as e
|
|
where e.key in ('places', 'accesses', 'networks')),
|
|
set_at, set_by
|
|
from settings
|
|
where values ?| array['places', 'accesses', 'networks'];
|
|
|
|
-- The layer keeps its other keys, when it was set and who set it; a layer that held only placement stays,
|
|
-- empty, so a layer that existed still exists.
|
|
update settings
|
|
set values = values - 'places' - 'accesses' - 'networks'
|
|
where values ?| array['places', 'accesses', 'networks'];
|