diff --git a/nexus/db-model/src/schema_versions.rs b/nexus/db-model/src/schema_versions.rs index d9f88a525e1..25c16df9e2e 100644 --- a/nexus/db-model/src/schema_versions.rs +++ b/nexus/db-model/src/schema_versions.rs @@ -17,7 +17,7 @@ use std::collections::BTreeMap; /// /// This must be updated when you change the database schema. Refer to /// schema/crdb/README.adoc in the root of this repository for details. -pub const SCHEMA_VERSION: SemverVersion = SemverVersion::new(68, 0, 0); +pub const SCHEMA_VERSION: SemverVersion = SemverVersion::new(69, 0, 0); /// List of all past database schema versions, in *reverse* order /// diff --git a/nexus/tests/integration_tests/schema.rs b/nexus/tests/integration_tests/schema.rs index 6615ce31e9c..85d67770c9f 100644 --- a/nexus/tests/integration_tests/schema.rs +++ b/nexus/tests/integration_tests/schema.rs @@ -1229,7 +1229,7 @@ fn after_37_0_1(client: &Client) -> BoxFuture<'_, ()> { }) } -fn before_68_0_0(client: &Client) -> BoxFuture<'_, ()> { +fn before_69_0_0(client: &Client) -> BoxFuture<'_, ()> { Box::pin(async move { client .batch_execute(&format!( @@ -1270,7 +1270,7 @@ fn before_68_0_0(client: &Client) -> BoxFuture<'_, ()> { }) } -fn after_68_0_0(client: &Client) -> BoxFuture<'_, ()> { +fn after_69_0_0(client: &Client) -> BoxFuture<'_, ()> { Box::pin(async { let rows = client .query("SELECT state FROM instance ORDER BY id", &[]) @@ -1338,8 +1338,8 @@ fn get_migration_checks() -> BTreeMap { DataMigrationFns { before: None, after: after_37_0_1 }, ); map.insert( - SemverVersion(semver::Version::parse("68.0.0").unwrap()), - DataMigrationFns { before: Some(before_68_0_0), after: after_68_0_0 }, + SemverVersion(semver::Version::parse("69.0.0").unwrap()), + DataMigrationFns { before: Some(before_69_0_0), after: after_69_0_0 }, ); map diff --git a/schema/crdb/dbinit.sql b/schema/crdb/dbinit.sql index 3e27d54e3de..5a024e63660 100644 --- a/schema/crdb/dbinit.sql +++ b/schema/crdb/dbinit.sql @@ -4050,7 +4050,7 @@ INSERT INTO omicron.public.db_metadata ( version, target_version ) VALUES - (TRUE, NOW(), NOW(), '68.0.0', NULL) + (TRUE, NOW(), NOW(), '69.0.0', NULL) ON CONFLICT DO NOTHING; COMMIT; diff --git a/schema/crdb/separate-instance-and-vmm-states/up02.sql b/schema/crdb/separate-instance-and-vmm-states/up02.sql index d7f40f8c5cb..aebe0119f5c 100644 --- a/schema/crdb/separate-instance-and-vmm-states/up02.sql +++ b/schema/crdb/separate-instance-and-vmm-states/up02.sql @@ -1,7 +1 @@ -CREATE TYPE IF NOT EXISTS omicron.public.instance_state_v2 AS ENUM ( - 'creating', - 'no_vmm', - 'vmm', - 'failed', - 'destroyed' -); +DROP VIEW IF EXISTS omicron.public.v2p_mapping_view; diff --git a/schema/crdb/separate-instance-and-vmm-states/up03.sql b/schema/crdb/separate-instance-and-vmm-states/up03.sql index c2e2e591911..d7f40f8c5cb 100644 --- a/schema/crdb/separate-instance-and-vmm-states/up03.sql +++ b/schema/crdb/separate-instance-and-vmm-states/up03.sql @@ -1 +1,7 @@ -ALTER TABLE omicron.public.instance ADD COLUMN IF NOT EXISTS downlevel_state omicron.public.instance_state; +CREATE TYPE IF NOT EXISTS omicron.public.instance_state_v2 AS ENUM ( + 'creating', + 'no_vmm', + 'vmm', + 'failed', + 'destroyed' +); diff --git a/schema/crdb/separate-instance-and-vmm-states/up04.sql b/schema/crdb/separate-instance-and-vmm-states/up04.sql index 89d57a32605..c2e2e591911 100644 --- a/schema/crdb/separate-instance-and-vmm-states/up04.sql +++ b/schema/crdb/separate-instance-and-vmm-states/up04.sql @@ -1,2 +1 @@ -SET LOCAL disallow_full_table_scans = off; -UPDATE omicron.public.instance SET downlevel_state = state; +ALTER TABLE omicron.public.instance ADD COLUMN IF NOT EXISTS downlevel_state omicron.public.instance_state; diff --git a/schema/crdb/separate-instance-and-vmm-states/up05.sql b/schema/crdb/separate-instance-and-vmm-states/up05.sql index b3d61de7125..89d57a32605 100644 --- a/schema/crdb/separate-instance-and-vmm-states/up05.sql +++ b/schema/crdb/separate-instance-and-vmm-states/up05.sql @@ -1 +1,2 @@ -ALTER TABLE omicron.public.instance DROP COLUMN IF EXISTS state; +SET LOCAL disallow_full_table_scans = off; +UPDATE omicron.public.instance SET downlevel_state = state; diff --git a/schema/crdb/separate-instance-and-vmm-states/up06.sql b/schema/crdb/separate-instance-and-vmm-states/up06.sql index 8a21a819beb..b3d61de7125 100644 --- a/schema/crdb/separate-instance-and-vmm-states/up06.sql +++ b/schema/crdb/separate-instance-and-vmm-states/up06.sql @@ -1 +1 @@ -ALTER TABLE omicron.public.instance ADD COLUMN IF NOT EXISTS state omicron.public.instance_state_v2; +ALTER TABLE omicron.public.instance DROP COLUMN IF EXISTS state; diff --git a/schema/crdb/separate-instance-and-vmm-states/up07.sql b/schema/crdb/separate-instance-and-vmm-states/up07.sql index 82346ee6a42..8a21a819beb 100644 --- a/schema/crdb/separate-instance-and-vmm-states/up07.sql +++ b/schema/crdb/separate-instance-and-vmm-states/up07.sql @@ -1,8 +1 @@ -SET LOCAL disallow_full_table_scans = off; -UPDATE omicron.public.instance SET state = CASE - WHEN downlevel_state = 'creating' THEN 'creating' - WHEN downlevel_state = 'failed' THEN 'failed' - WHEN downlevel_state = 'destroyed' THEN 'destroyed' - WHEN active_propolis_id IS NOT NULL THEN 'vmm' - ELSE 'no_vmm' -END; +ALTER TABLE omicron.public.instance ADD COLUMN IF NOT EXISTS state omicron.public.instance_state_v2; diff --git a/schema/crdb/separate-instance-and-vmm-states/up08.sql b/schema/crdb/separate-instance-and-vmm-states/up08.sql index 1036c339b81..82346ee6a42 100644 --- a/schema/crdb/separate-instance-and-vmm-states/up08.sql +++ b/schema/crdb/separate-instance-and-vmm-states/up08.sql @@ -1 +1,8 @@ -ALTER TABLE omicron.public.instance ALTER COLUMN state SET NOT NULL; +SET LOCAL disallow_full_table_scans = off; +UPDATE omicron.public.instance SET state = CASE + WHEN downlevel_state = 'creating' THEN 'creating' + WHEN downlevel_state = 'failed' THEN 'failed' + WHEN downlevel_state = 'destroyed' THEN 'destroyed' + WHEN active_propolis_id IS NOT NULL THEN 'vmm' + ELSE 'no_vmm' +END; diff --git a/schema/crdb/separate-instance-and-vmm-states/up09.sql b/schema/crdb/separate-instance-and-vmm-states/up09.sql index fbce77e29c6..1036c339b81 100644 --- a/schema/crdb/separate-instance-and-vmm-states/up09.sql +++ b/schema/crdb/separate-instance-and-vmm-states/up09.sql @@ -1 +1 @@ -ALTER TABLE omicron.public.instance DROP COLUMN IF EXISTS downlevel_state; +ALTER TABLE omicron.public.instance ALTER COLUMN state SET NOT NULL; diff --git a/schema/crdb/separate-instance-and-vmm-states/up10.sql b/schema/crdb/separate-instance-and-vmm-states/up10.sql index 39aa085b6d4..fbce77e29c6 100644 --- a/schema/crdb/separate-instance-and-vmm-states/up10.sql +++ b/schema/crdb/separate-instance-and-vmm-states/up10.sql @@ -1,10 +1 @@ -CREATE TYPE IF NOT EXISTS omicron.public.vmm_state AS ENUM ( - 'starting', - 'running', - 'stopping', - 'stopped', - 'rebooting', - 'migrating', - 'failed', - 'destroyed' -); +ALTER TABLE omicron.public.instance DROP COLUMN IF EXISTS downlevel_state; diff --git a/schema/crdb/separate-instance-and-vmm-states/up11.sql b/schema/crdb/separate-instance-and-vmm-states/up11.sql index 8bfa1e76234..39aa085b6d4 100644 --- a/schema/crdb/separate-instance-and-vmm-states/up11.sql +++ b/schema/crdb/separate-instance-and-vmm-states/up11.sql @@ -1 +1,10 @@ -ALTER TABLE omicron.public.vmm ADD COLUMN IF NOT EXISTS downlevel_state omicron.public.instance_state; +CREATE TYPE IF NOT EXISTS omicron.public.vmm_state AS ENUM ( + 'starting', + 'running', + 'stopping', + 'stopped', + 'rebooting', + 'migrating', + 'failed', + 'destroyed' +); diff --git a/schema/crdb/separate-instance-and-vmm-states/up12.sql b/schema/crdb/separate-instance-and-vmm-states/up12.sql index 8f906bcb27e..8bfa1e76234 100644 --- a/schema/crdb/separate-instance-and-vmm-states/up12.sql +++ b/schema/crdb/separate-instance-and-vmm-states/up12.sql @@ -1,2 +1 @@ -SET LOCAL disallow_full_table_scans = off; -UPDATE omicron.public.vmm SET downlevel_state = state; +ALTER TABLE omicron.public.vmm ADD COLUMN IF NOT EXISTS downlevel_state omicron.public.instance_state; diff --git a/schema/crdb/separate-instance-and-vmm-states/up13.sql b/schema/crdb/separate-instance-and-vmm-states/up13.sql index 65d2e99f389..8f906bcb27e 100644 --- a/schema/crdb/separate-instance-and-vmm-states/up13.sql +++ b/schema/crdb/separate-instance-and-vmm-states/up13.sql @@ -1 +1,2 @@ -ALTER TABLE omicron.public.vmm DROP COLUMN IF EXISTS state; +SET LOCAL disallow_full_table_scans = off; +UPDATE omicron.public.vmm SET downlevel_state = state; diff --git a/schema/crdb/separate-instance-and-vmm-states/up14.sql b/schema/crdb/separate-instance-and-vmm-states/up14.sql index 3f3f80d5080..65d2e99f389 100644 --- a/schema/crdb/separate-instance-and-vmm-states/up14.sql +++ b/schema/crdb/separate-instance-and-vmm-states/up14.sql @@ -1 +1 @@ -ALTER TABLE omicron.public.vmm ADD COLUMN IF NOT EXISTS state omicron.public.vmm_state; +ALTER TABLE omicron.public.vmm DROP COLUMN IF EXISTS state; diff --git a/schema/crdb/separate-instance-and-vmm-states/up15.sql b/schema/crdb/separate-instance-and-vmm-states/up15.sql index 0e7b8f8a82c..3f3f80d5080 100644 --- a/schema/crdb/separate-instance-and-vmm-states/up15.sql +++ b/schema/crdb/separate-instance-and-vmm-states/up15.sql @@ -1,2 +1 @@ -SET LOCAL disallow_full_table_scans = off; -UPDATE omicron.public.vmm SET state = downlevel_state::text::vmm_state; +ALTER TABLE omicron.public.vmm ADD COLUMN IF NOT EXISTS state omicron.public.vmm_state; diff --git a/schema/crdb/separate-instance-and-vmm-states/up16.sql b/schema/crdb/separate-instance-and-vmm-states/up16.sql index 7cc912ba991..0e7b8f8a82c 100644 --- a/schema/crdb/separate-instance-and-vmm-states/up16.sql +++ b/schema/crdb/separate-instance-and-vmm-states/up16.sql @@ -1 +1,2 @@ -ALTER TABLE omicron.public.vmm ALTER COLUMN state SET NOT NULL; +SET LOCAL disallow_full_table_scans = off; +UPDATE omicron.public.vmm SET state = downlevel_state::text::vmm_state; diff --git a/schema/crdb/separate-instance-and-vmm-states/up17.sql b/schema/crdb/separate-instance-and-vmm-states/up17.sql index 349f05d7ecf..7cc912ba991 100644 --- a/schema/crdb/separate-instance-and-vmm-states/up17.sql +++ b/schema/crdb/separate-instance-and-vmm-states/up17.sql @@ -1 +1 @@ -ALTER TABLE omicron.public.vmm DROP COLUMN IF EXISTS downlevel_state; +ALTER TABLE omicron.public.vmm ALTER COLUMN state SET NOT NULL; diff --git a/schema/crdb/separate-instance-and-vmm-states/up18.sql b/schema/crdb/separate-instance-and-vmm-states/up18.sql index b1a96ece520..349f05d7ecf 100644 --- a/schema/crdb/separate-instance-and-vmm-states/up18.sql +++ b/schema/crdb/separate-instance-and-vmm-states/up18.sql @@ -1,23 +1 @@ -CREATE OR REPLACE VIEW omicron.public.sled_instance -AS SELECT - instance.id, - instance.name, - silo.name as silo_name, - project.name as project_name, - vmm.sled_id as active_sled_id, - instance.time_created, - instance.time_modified, - instance.migration_id, - instance.ncpus, - instance.memory, - vmm.state -FROM - omicron.public.instance AS instance - JOIN omicron.public.project AS project ON - instance.project_id = project.id - JOIN omicron.public.silo AS silo ON - project.silo_id = silo.id - JOIN omicron.public.vmm AS vmm ON - instance.active_propolis_id = vmm.id -WHERE - instance.time_deleted IS NULL AND vmm.time_deleted IS NULL; +ALTER TABLE omicron.public.vmm DROP COLUMN IF EXISTS downlevel_state; diff --git a/schema/crdb/separate-instance-and-vmm-states/up19.sql b/schema/crdb/separate-instance-and-vmm-states/up19.sql index 7575559a2f7..b1a96ece520 100644 --- a/schema/crdb/separate-instance-and-vmm-states/up19.sql +++ b/schema/crdb/separate-instance-and-vmm-states/up19.sql @@ -1 +1,23 @@ -DROP TYPE IF EXISTS omicron.public.instance_state; +CREATE OR REPLACE VIEW omicron.public.sled_instance +AS SELECT + instance.id, + instance.name, + silo.name as silo_name, + project.name as project_name, + vmm.sled_id as active_sled_id, + instance.time_created, + instance.time_modified, + instance.migration_id, + instance.ncpus, + instance.memory, + vmm.state +FROM + omicron.public.instance AS instance + JOIN omicron.public.project AS project ON + instance.project_id = project.id + JOIN omicron.public.silo AS silo ON + project.silo_id = silo.id + JOIN omicron.public.vmm AS vmm ON + instance.active_propolis_id = vmm.id +WHERE + instance.time_deleted IS NULL AND vmm.time_deleted IS NULL; diff --git a/schema/crdb/separate-instance-and-vmm-states/up20.sql b/schema/crdb/separate-instance-and-vmm-states/up20.sql new file mode 100644 index 00000000000..7575559a2f7 --- /dev/null +++ b/schema/crdb/separate-instance-and-vmm-states/up20.sql @@ -0,0 +1 @@ +DROP TYPE IF EXISTS omicron.public.instance_state; diff --git a/schema/crdb/separate-instance-and-vmm-states/up21.sql b/schema/crdb/separate-instance-and-vmm-states/up21.sql new file mode 100644 index 00000000000..a0fe7b7a485 --- /dev/null +++ b/schema/crdb/separate-instance-and-vmm-states/up21.sql @@ -0,0 +1,42 @@ +CREATE VIEW IF NOT EXISTS omicron.public.v2p_mapping_view +AS +WITH VmV2pMappings AS ( + SELECT + n.id as nic_id, + s.id as sled_id, + s.ip as sled_ip, + v.vni, + n.mac, + n.ip + FROM omicron.public.network_interface n + JOIN omicron.public.vpc_subnet vs ON vs.id = n.subnet_id + JOIN omicron.public.vpc v ON v.id = n.vpc_id + JOIN omicron.public.vmm vmm ON n.parent_id = vmm.instance_id + JOIN omicron.public.sled s ON vmm.sled_id = s.id + WHERE n.time_deleted IS NULL + AND n.kind = 'instance' + AND (vmm.state = 'running' OR vmm.state = 'starting') + AND s.sled_policy = 'in_service' + AND s.sled_state = 'active' +), +ProbeV2pMapping AS ( + SELECT + n.id as nic_id, + s.id as sled_id, + s.ip as sled_ip, + v.vni, + n.mac, + n.ip + FROM omicron.public.network_interface n + JOIN omicron.public.vpc_subnet vs ON vs.id = n.subnet_id + JOIN omicron.public.vpc v ON v.id = n.vpc_id + JOIN omicron.public.probe p ON n.parent_id = p.id + JOIN omicron.public.sled s ON p.sled = s.id + WHERE n.time_deleted IS NULL + AND n.kind = 'probe' + AND s.sled_policy = 'in_service' + AND s.sled_state = 'active' +) +SELECT nic_id, sled_id, sled_ip, vni, mac, ip FROM VmV2pMappings +UNION +SELECT nic_id, sled_id, sled_ip, vni, mac, ip FROM ProbeV2pMapping;