-- 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'];