]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#3677] Posgresql now migrates client-classes data
authorThomas Markwalder <tmark@isc.org>
Tue, 3 Dec 2024 21:24:36 +0000 (16:24 -0500)
committerThomas Markwalder <tmark@isc.org>
Fri, 6 Dec 2024 14:16:04 +0000 (14:16 +0000)
modified:   src/bin/admin/tests/pgsql_tests.sh.in
modified:   src/share/database/scripts/pgsql/dhcpdb_create.pgsql
modified:   src/share/database/scripts/pgsql/upgrade_026_to_027.sh.in
modified:   src/share/database/scripts/mysql/upgrade_026_to_027.sh.in
modified:   src/share/database/scripts/mysql/dhcpdb_create.mysql

src/bin/admin/tests/pgsql_tests.sh.in
src/share/database/scripts/mysql/dhcpdb_create.mysql
src/share/database/scripts/mysql/upgrade_026_to_027.sh.in
src/share/database/scripts/pgsql/dhcpdb_create.pgsql
src/share/database/scripts/pgsql/upgrade_026_to_027.sh.in

index fd5c200e1829b27c3f7c980b6952089cbc055664..d9620c8d2fb0faef5706c138f6ad14bba6daee54 100644 (file)
@@ -2872,6 +2872,94 @@ pgsql_remove_control_socket_parameters_test() {
     test_finish 0
 }
 
+# Verifies that client_class to client_classes migrates
+# single text entries to JSON list correctly
+pgsql_migrate_client_class_test() {
+
+    test_start "pgsql.pgsql_migrate_client_class_test"
+
+    # Let's wipe the whole database
+    pgsql_wipe
+
+    # We need to create an older database with lease data so we can
+    # verify the upgrade mechanisms which prepopulate the lease stat
+    # tables.
+    #
+    # Initialize database to schema 1.0.
+    pgsql_execute_script "@abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.pgsql"
+    assert_eq 0 "${EXIT_CODE}" "cannot initialize 1.0 database, expected exit code: %d, actual: %d"
+
+    # Now upgrade to schema 26.0
+    pgsql_upgrade_schema_to_version 26.0
+
+    # Now we need insert some leases to "migrate" for both v4 and v6
+    qry="\
+ select set_config('kea.disable_audit', 'true', false);\
+ insert into dhcp4_shared_network (name, client_class, modification_ts) values ('net1', 'abc', current_timestamp);\
+ insert into dhcp4_shared_network (name, client_class, modification_ts) values ('net2', '', current_timestamp);\
+ insert into dhcp4_shared_network (name, modification_ts) values ('net3', current_timestamp);\
+ insert into dhcp4_subnet (subnet_id, subnet_prefix, modification_ts, client_class)\
+    values (1, '192.0.0.0/24', current_timestamp, 'subber');\
+ insert into dhcp4_pool (subnet_id, start_address, end_address, modification_ts, client_class)\
+    values (1, '192.0.0.0', '192.0.0.1', current_timestamp, 'poolio');\
+ insert into dhcp6_shared_network (name, client_class, modification_ts) values ('net6', 'xyz', current_timestamp);\
+ insert into dhcp6_subnet (subnet_id, subnet_prefix, modification_ts, client_class)\
+    values (6, '2001:db8:1::/64', current_timestamp, 'subber6');\
+ insert into dhcp6_pool (subnet_id, start_address, end_address, modification_ts, client_class)\
+    values (6, '2001:db8:1::1', '2001:db8:1::2', current_timestamp, 'poolio6');\
+ insert into dhcp6_pd_pool (subnet_id, prefix, prefix_length, delegated_prefix_length, \
+                            excluded_prefix_length, modification_ts, client_class) \
+    values (6, ('3001::'), 64, 72, 0, current_timestamp, 'pd_poolio');\
+ select set_config('kea.disable_audit', 'false', false);\
+ "
+    run_statement "insert test data" "$qry"
+
+    # Let's upgrade it to the latest version.
+    pgsql_upgrade_schema_to_version 27.0
+
+    # Verify dhcp4_shared_network values
+    qry="select count(name) from dhcp4_shared_network where name = 'net1' and client_classes = '[ \"abc\" ]';"
+    run_statement "#1" "$qry" 1
+
+    qry="select count(name) from dhcp4_shared_network where name = 'net2' and client_classes IS NULL;"
+    run_statement "#2" "$qry" 1
+
+    qry="select count(name) from dhcp4_shared_network where name = 'net3' and client_classes IS NULL;"
+    run_statement "#3" "$qry" 1
+
+    # We don't bother verifying all null and '' handling again, only that the conversion function is
+    # called for remaining tables.
+
+    # Verify dhcp4_subnet.
+    qry="select count(subnet_id) from dhcp4_subnet where subnet_id = 1 and client_classes = '[ \"subber\" ]';"
+    run_statement "#4" "$qry" 1
+
+    # Verify dhcp4_pool.
+    qry="select count(subnet_id) from dhcp4_pool where subnet_id = 1 and client_classes = '[ \"poolio\" ]';"
+    run_statement "#5" "$qry" 1
+
+    # Verify dhcp6_shared_network.
+    qry="select count(name) from dhcp6_shared_network where name = 'net6' and client_classes = '[ \"xyz\" ]';"
+    run_statement "#6" "$qry" 1
+
+    # Verify dhcp6_subnet.
+    qry="select count(subnet_id) from dhcp6_subnet where subnet_id = 6 and client_classes = '[ \"subber6\" ]';"
+    run_statement "#7" "$qry" 1
+
+    # Verify dhcp6_pool.
+    qry="select count(subnet_id) from dhcp6_pool where subnet_id = 6 and client_classes = '[ \"poolio6\" ]';"
+    run_statement "#8" "$qry" 1
+
+    # Verify dhcp6_pd_pool.
+    qry="select count(subnet_id) from dhcp6_pd_pool where subnet_id = 6 and client_classes = '[ \"pd_poolio\" ]';"
+    run_statement "#9" "$qry" 1
+
+    pgsql_wipe
+
+    test_finish 0
+}
+
+
 # Run tests.
 pgsql_db_init_test
 pgsql_db_version_test
@@ -2900,3 +2988,4 @@ pgsql_reservation_mode_global_parameters_test
 pgsql_reservation_mode_out_of_pool_parameters_test
 pgsql_migrate_opt_record_type
 pgsql_remove_control_socket_parameters_test
+pgsql_migrate_client_class_test
index 8423b8e328a5cf4efbf72ce010d584189d4b3be3..c363b52a8413f9e9a7a0e052321e9bbe96f228e0 100644 (file)
@@ -6078,7 +6078,7 @@ CREATE FUNCTION textToJSONList(orig TEXT)
 RETURNS  TEXT
 DETERMINISTIC
 BEGIN
-    IF orig = '' THEN
+    IF orig = '' OR orig IS NULL THEN
         RETURN NULL;
     END IF;
 
index 0178a2a149e9aefb68096bee52af344db195e1b6..194e071291f6f4032acf91eea9f63abadd5eaa2f 100644 (file)
@@ -64,7 +64,7 @@ CREATE FUNCTION textToJSONList(orig TEXT)
 RETURNS  TEXT
 DETERMINISTIC
 BEGIN
-    IF orig = '' THEN
+    IF orig = '' OR orig IS NULL THEN
         RETURN NULL;
     END IF;
 
index 87c2448a5b58645a3f024a760300c8277c846699..0350ce87bc6fbc61cbed26babdfe0a969945b5a7 100644 (file)
@@ -6531,27 +6531,59 @@ UPDATE schema_version
 
 -- This line starts the schema upgrade to version 27.0.
 
+SELECT set_config('kea.disable_audit', 'true', false);
+
+CREATE OR REPLACE FUNCTION textToJSONList(orig TEXT)
+    RETURNS TEXT AS $$
+DECLARE
+BEGIN
+    IF orig = '' OR orig IS NULL THEN
+        RETURN NULL;
+    END IF;
+
+    RETURN CONCAT('[ "', orig, '" ]');
+END;
+$$ LANGUAGE plpgsql;
+
 ALTER TABLE dhcp4_shared_network RENAME client_class TO client_classes;
 ALTER TABLE dhcp4_shared_network ALTER COLUMN client_classes TYPE TEXT;
 
+UPDATE dhcp4_shared_network SET client_classes = textToJSONList(client_classes);
+
 ALTER TABLE dhcp4_subnet RENAME client_class TO client_classes;
 ALTER TABLE dhcp4_subnet ALTER COLUMN client_classes TYPE TEXT;
 
+UPDATE dhcp4_subnet SET client_classes = textToJSONList(client_classes);
+
 ALTER TABLE dhcp4_pool RENAME client_class TO client_classes;
 ALTER TABLE dhcp4_pool ALTER COLUMN client_classes TYPE TEXT;
 
+UPDATE dhcp4_pool SET client_classes = textToJSONList(client_classes);
+
 ALTER TABLE dhcp6_shared_network RENAME client_class TO client_classes;
 ALTER TABLE dhcp6_shared_network ALTER COLUMN client_classes TYPE TEXT;
 
+UPDATE dhcp6_shared_network SET client_classes = textToJSONList(client_classes);
+
 ALTER TABLE dhcp6_subnet RENAME client_class TO client_classes;
 ALTER TABLE dhcp6_subnet ALTER COLUMN client_classes TYPE TEXT;
 
+UPDATE dhcp6_subnet SET client_classes = textToJSONList(client_classes);
+
 ALTER TABLE dhcp6_pool RENAME client_class TO client_classes;
 ALTER TABLE dhcp6_pool ALTER COLUMN client_classes TYPE TEXT;
 
+UPDATE dhcp6_pool SET client_classes = textToJSONList(client_classes);
+
 ALTER TABLE dhcp6_pd_pool RENAME client_class TO client_classes;
 ALTER TABLE dhcp6_pd_pool ALTER COLUMN client_classes TYPE TEXT;
 
+UPDATE dhcp6_pd_pool SET client_classes = textToJSONList(client_classes);
+
+DROP FUNCTION IF EXISTS testToJSONList();
+
+SELECT set_config('kea.disable_audit', 'false', false);
+
 -- Update the schema version number.
 UPDATE schema_version
     SET version = '27', minor = '0';
index c64676eb893c3f4dc8f98d82baca5d8fe60b3b55..d20a570e7da5cfe9df0be9ca0a1b24ad313ee4cf 100644 (file)
@@ -39,27 +39,59 @@ START TRANSACTION;
 
 -- This line starts the schema upgrade to version 27.0.
 
+SELECT set_config('kea.disable_audit', 'true', false);
+
+CREATE OR REPLACE FUNCTION textToJSONList(orig TEXT)
+    RETURNS TEXT AS \$\$
+DECLARE
+BEGIN
+    IF orig = '' OR orig IS NULL THEN
+        RETURN NULL;
+    END IF;
+
+    RETURN CONCAT('[ "', orig, '" ]');
+END;
+\$\$ LANGUAGE plpgsql;
+
 ALTER TABLE dhcp4_shared_network RENAME client_class TO client_classes;
 ALTER TABLE dhcp4_shared_network ALTER COLUMN client_classes TYPE TEXT;
 
+UPDATE dhcp4_shared_network SET client_classes = textToJSONList(client_classes);
+
 ALTER TABLE dhcp4_subnet RENAME client_class TO client_classes;
 ALTER TABLE dhcp4_subnet ALTER COLUMN client_classes TYPE TEXT;
 
+UPDATE dhcp4_subnet SET client_classes = textToJSONList(client_classes);
+
 ALTER TABLE dhcp4_pool RENAME client_class TO client_classes;
 ALTER TABLE dhcp4_pool ALTER COLUMN client_classes TYPE TEXT;
 
+UPDATE dhcp4_pool SET client_classes = textToJSONList(client_classes);
+
 ALTER TABLE dhcp6_shared_network RENAME client_class TO client_classes;
 ALTER TABLE dhcp6_shared_network ALTER COLUMN client_classes TYPE TEXT;
 
+UPDATE dhcp6_shared_network SET client_classes = textToJSONList(client_classes);
+
 ALTER TABLE dhcp6_subnet RENAME client_class TO client_classes;
 ALTER TABLE dhcp6_subnet ALTER COLUMN client_classes TYPE TEXT;
 
+UPDATE dhcp6_subnet SET client_classes = textToJSONList(client_classes);
+
 ALTER TABLE dhcp6_pool RENAME client_class TO client_classes;
 ALTER TABLE dhcp6_pool ALTER COLUMN client_classes TYPE TEXT;
 
+UPDATE dhcp6_pool SET client_classes = textToJSONList(client_classes);
+
 ALTER TABLE dhcp6_pd_pool RENAME client_class TO client_classes;
 ALTER TABLE dhcp6_pd_pool ALTER COLUMN client_classes TYPE TEXT;
 
+UPDATE dhcp6_pd_pool SET client_classes = textToJSONList(client_classes);
+
+DROP FUNCTION IF EXISTS testToJSONList();
+
+SELECT set_config('kea.disable_audit', 'false', false);
+
 -- Update the schema version number.
 UPDATE schema_version
     SET version = '27', minor = '0';