Improve ergonomics of data migration test#10164
Conversation
| @@ -0,0 +1,88 @@ | |||
| // This Source Code Form is subject to the terms of the Mozilla Public | |||
There was a problem hiding this comment.
FYI! Of all the files in data_migrations.rs to read, this is the most important one to review.
The others are "Just moving" test functions out of schema.rs
hawkw
left a comment
There was a problem hiding this comment.
This is awesome. I had a couple small suggestions, but I think this will make writing these tests much less annoying!
| macro_rules! register { | ||
| ($map:ident, $versions:ident, $mod:ident) => { | ||
| let name = stringify!($mod).replace('_', "-"); | ||
| let version = $versions | ||
| .get(name.as_str()) | ||
| .unwrap_or_else(|| { | ||
| panic!("migration {name:?} not found in KNOWN_VERSIONS") | ||
| }) | ||
| .clone(); | ||
| $map.insert(version, $mod::checks()); | ||
| }; | ||
| } | ||
|
|
||
| pub(crate) fn get_migration_checks() -> BTreeMap<Version, DataMigrationFns> { | ||
| let versions: HashMap<&str, Version> = KNOWN_VERSIONS | ||
| .iter() | ||
| .map(|v| (v.relative_path(), v.semver().clone())) | ||
| .collect(); | ||
| let mut map = BTreeMap::new(); | ||
|
|
||
| register!(map, versions, zone_image_resolver_inventory); | ||
| register!(map, versions, vpc_firewall_icmp); | ||
| register!(map, versions, boot_partitions_inventory); | ||
| register!(map, versions, fix_leaked_bp_oximeter_read_policy_rows); | ||
| register!(map, versions, route_config_rib_priority); | ||
| register!(map, versions, inv_clear_mupdate_override); | ||
| register!(map, versions, populate_db_metadata_nexus); | ||
| register!(map, versions, positive_quotas); | ||
| register!(map, versions, disk_types); | ||
| register!(map, versions, one_big_ereport_table); | ||
| register!(map, versions, blueprint_sled_config_subnet); | ||
| register!(map, versions, blueprint_sled_last_used_ip); | ||
| register!(map, versions, audit_log_credential_id); | ||
| register!(map, versions, fix_session_token_column_order); | ||
| register!(map, versions, bgp_unnumbered_peers); | ||
| register!(map, versions, bgp_config_max_paths_not_null); | ||
| register!(map, versions, ereport_everyone_gets_a_slot); | ||
| register!(map, versions, rename_default_igw_ip_pool); |
There was a problem hiding this comment.
nit, take it or leave it: since register is evaluated inside this function exclusively, i think the map and versions identifiers don't actually need to be passed in?
| macro_rules! register { | |
| ($map:ident, $versions:ident, $mod:ident) => { | |
| let name = stringify!($mod).replace('_', "-"); | |
| let version = $versions | |
| .get(name.as_str()) | |
| .unwrap_or_else(|| { | |
| panic!("migration {name:?} not found in KNOWN_VERSIONS") | |
| }) | |
| .clone(); | |
| $map.insert(version, $mod::checks()); | |
| }; | |
| } | |
| pub(crate) fn get_migration_checks() -> BTreeMap<Version, DataMigrationFns> { | |
| let versions: HashMap<&str, Version> = KNOWN_VERSIONS | |
| .iter() | |
| .map(|v| (v.relative_path(), v.semver().clone())) | |
| .collect(); | |
| let mut map = BTreeMap::new(); | |
| register!(map, versions, zone_image_resolver_inventory); | |
| register!(map, versions, vpc_firewall_icmp); | |
| register!(map, versions, boot_partitions_inventory); | |
| register!(map, versions, fix_leaked_bp_oximeter_read_policy_rows); | |
| register!(map, versions, route_config_rib_priority); | |
| register!(map, versions, inv_clear_mupdate_override); | |
| register!(map, versions, populate_db_metadata_nexus); | |
| register!(map, versions, positive_quotas); | |
| register!(map, versions, disk_types); | |
| register!(map, versions, one_big_ereport_table); | |
| register!(map, versions, blueprint_sled_config_subnet); | |
| register!(map, versions, blueprint_sled_last_used_ip); | |
| register!(map, versions, audit_log_credential_id); | |
| register!(map, versions, fix_session_token_column_order); | |
| register!(map, versions, bgp_unnumbered_peers); | |
| register!(map, versions, bgp_config_max_paths_not_null); | |
| register!(map, versions, ereport_everyone_gets_a_slot); | |
| register!(map, versions, rename_default_igw_ip_pool); | |
| macro_rules! register { | |
| ($mod:ident) => { | |
| let name = stringify!($mod).replace('_', "-"); | |
| let version = versions | |
| .get(name.as_str()) | |
| .unwrap_or_else(|| { | |
| panic!("migration {name:?} not found in KNOWN_VERSIONS") | |
| }) | |
| .clone(); | |
| map.insert(version, $mod::checks()); | |
| }; | |
| } | |
| pub(crate) fn get_migration_checks() -> BTreeMap<Version, DataMigrationFns> { | |
| let versions: HashMap<&str, Version> = KNOWN_VERSIONS | |
| .iter() | |
| .map(|v| (v.relative_path(), v.semver().clone())) | |
| .collect(); | |
| let mut map = BTreeMap::new(); | |
| register!(zone_image_resolver_inventory); | |
| register!(vpc_firewall_icmp); | |
| register!(boot_partitions_inventory); | |
| register!(fix_leaked_bp_oximeter_read_policy_rows); | |
| register!(route_config_rib_priority); | |
| register!(inv_clear_mupdate_override); | |
| register!(populate_db_metadata_nexus); | |
| register!(positive_quotas); | |
| register!(disk_types); | |
| register!(one_big_ereport_table); | |
| register!(blueprint_sled_config_subnet); | |
| register!(blueprint_sled_last_used_ip); | |
| register!(audit_log_credential_id); | |
| register!(fix_session_token_column_order); | |
| register!(bgp_unnumbered_peers); | |
| register!(bgp_config_max_paths_not_null); | |
| register!(ereport_everyone_gets_a_slot); | |
| register!(rename_default_igw_ip_pool); |
which might be slightly nicer for the user?
There was a problem hiding this comment.
Sure, updated. Gotta move the macro inside the function for this to work, but it does (done in faf7e1b)
| //! When advancing the schema baseline, delete the files whose migration | ||
| //! names are older than the new baseline, and remove the corresponding | ||
| //! `mod` and `register!` lines below. |
There was a problem hiding this comment.
I think it might be nice if this explained a bit more about what "advancing the schema baseline" means. When would I need to do this?
There was a problem hiding this comment.
Explained things a bit, and linked to docs in faf7e1b
This PR should make it easier to concurrently merge data migrations, but it also should make it easier to "remove old data migrations", identified by #8271.