From: Marcin Siodelski Date: Fri, 17 Sep 2021 13:02:32 +0000 (+0200) Subject: [#2094] Created MySQL schema version 12 X-Git-Tag: Kea-2.0.0~103 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e8df2ff2e3957f88b7c6f2c773a5efa8e53b4196;p=thirdparty%2Fkea.git [#2094] Created MySQL schema version 12 The updated schema causes auto-deletion of options associated with deleted client classes. --- diff --git a/configure.ac b/configure.ac index e31e80ac16..faab434b15 100644 --- a/configure.ac +++ b/configure.ac @@ -1796,6 +1796,8 @@ AC_CONFIG_FILES([src/share/database/scripts/mysql/upgrade_009.6_to_010.0.sh], [chmod +x src/share/database/scripts/mysql/upgrade_009.6_to_010.0.sh]) AC_CONFIG_FILES([src/share/database/scripts/mysql/upgrade_010_to_011.sh], [chmod +x src/share/database/scripts/mysql/upgrade_010_to_011.sh]) +AC_CONFIG_FILES([src/share/database/scripts/mysql/upgrade_011_to_012.sh], + [chmod +x src/share/database/scripts/mysql/upgrade_011_to_012.sh]) AC_CONFIG_FILES([src/share/database/scripts/mysql/wipe_data.sh], [chmod +x src/share/database/scripts/mysql/wipe_data.sh]) AC_CONFIG_FILES([src/share/database/scripts/pgsql/Makefile]) diff --git a/src/bin/admin/tests/mysql_tests.sh.in b/src/bin/admin/tests/mysql_tests.sh.in index 33d21c0e5d..12af0615fa 100644 --- a/src/bin/admin/tests/mysql_tests.sh.in +++ b/src/bin/admin/tests/mysql_tests.sh.in @@ -261,7 +261,7 @@ mysql_upgrade_test() { version=$("${kea_admin}" db-version mysql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}") assert_str_eq "1.0" "${version}" "Expected kea-admin to return %s, returned value was %s" - # Ok, we have a 1.0 database. Let's upgrade it to 11.0. + # Ok, we have a 1.0 database. Let's upgrade it to 12.0. run_command \ "${kea_admin}" db-upgrade mysql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}" assert_eq 0 "${EXIT_CODE}" "kea-admin db-upgrade mysql failed, expected %d, returned non-zero status code %d\n" @@ -853,9 +853,41 @@ insert into hosts(dhcp_identifier, dhcp_identifier_type, dhcp4_subnet_id, ipv4_a mysql_execute "${qry}" assert_eq 0 "${EXIT_CODE}" "$qry failed. dhcp6_client_classes preferred lifetime columns missing?" - # Verify upgraded schema reports version 11.0 + # Check upgrade from 11.0 to 12.0. + + # Add classes with associated options. + qry="\ +SET @disable_audit = 1;\ +INSERT INTO dhcp4_client_class(name, modification_ts) VALUES ('foo', now());\ +INSERT INTO dhcp4_options(code, scope_id, dhcp_client_class, modification_ts) VALUES (222, 2, 'foo', now());\ +INSERT INTO dhcp6_client_class(name, modification_ts) VALUES ('foo', now());\ +INSERT INTO dhcp6_options(code, scope_id, dhcp_client_class, modification_ts) VALUES (222, 2, 'foo', now());\ +SET @disable_audit = 0;" + run_command \ + mysql_execute "$qry" + assert_eq 0 "${EXIT_CODE}" "inserting classes and options failed, expected exit code %d, actual %d" + + # Delete the classes. + qry="\ +SET @disable_audit = 1;\ +DELETE FROM dhcp4_client_class;\ +DELETE FROM dhcp6_client_class;\ +SET @disable_audit = 0;" + run_command \ + mysql_execute "$qry" + assert_eq 0 "${EXIT_CODE}" "deleting classes failed, expected exit code %d, actual %d" + + # Ensure that the DHCPv4 option was deleted. + qry="SELECT COUNT(*) from dhcp4_options" + run_statement "dhcp4_options count" "$qry" 0 + + # Ensure that the DHCPv6 option was deleted. + qry="SELECT COUNT(*) from dhcp6_options" + run_statement "dhcp6_options count" "$qry" 0 + + # Verify upgraded schema reports version 12.0 version=$("${kea_admin}" db-version mysql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}") - assert_str_eq "11.0" "${version}" "Expected kea-admin to return %s, returned value was %s" + assert_str_eq "12.0" "${version}" "Expected kea-admin to return %s, returned value was %s" # Let's wipe the whole database mysql_wipe diff --git a/src/share/database/scripts/mysql/.gitignore b/src/share/database/scripts/mysql/.gitignore index 7d1937ed42..b6394bdd10 100644 --- a/src/share/database/scripts/mysql/.gitignore +++ b/src/share/database/scripts/mysql/.gitignore @@ -19,4 +19,5 @@ /upgrade_009.5_to_009.6.sh /upgrade_009.6_to_010.0.sh /upgrade_010_to_011.sh +/upgrade_011_to_012.sh /wipe_data.sh diff --git a/src/share/database/scripts/mysql/dhcpdb_create.mysql b/src/share/database/scripts/mysql/dhcpdb_create.mysql index e04ea8933d..a56b95279a 100644 --- a/src/share/database/scripts/mysql/dhcpdb_create.mysql +++ b/src/share/database/scripts/mysql/dhcpdb_create.mysql @@ -4014,6 +4014,8 @@ ALTER TABLE dhcp6_option_def UPDATE schema_version SET version = '10', minor = '0'; +# This line concludes database upgrade to version 10. + # Reverse index order to improve reclamation query performance # Add a constraint that any state value added to the lease4 must # map to a value in the lease_state table. Note we have to drop @@ -4042,7 +4044,28 @@ ALTER TABLE dhcp6_client_class UPDATE schema_version SET version = '11', minor = '0'; -# This line concludes database upgrade to version 10. +# This line concludes database upgrade to version 11. + +# Add a foreign keys referencing a client classes. If an option is +# associated with a client class, the option will be deleted +# along with the deleted client class. +ALTER TABLE dhcp4_options + ADD CONSTRAINT fk_dhcp4_options_client_class + FOREIGN KEY (dhcp_client_class) + REFERENCES dhcp4_client_class (name) + ON DELETE CASCADE ON UPDATE CASCADE; + +ALTER TABLE dhcp6_options + ADD CONSTRAINT fk_dhcp6_options_client_class + FOREIGN KEY (dhcp_client_class) + REFERENCES dhcp6_client_class (name) + ON DELETE CASCADE ON UPDATE CASCADE; + +# Update the schema version number +UPDATE schema_version + SET version = '12', minor = '0'; + +# This line concludes database upgrade to version 12. # Notes: # diff --git a/src/share/database/scripts/mysql/upgrade_011_to_012.sh.in b/src/share/database/scripts/mysql/upgrade_011_to_012.sh.in new file mode 100644 index 0000000000..f24f6192fb --- /dev/null +++ b/src/share/database/scripts/mysql/upgrade_011_to_012.sh.in @@ -0,0 +1,76 @@ +#!/bin/sh + +# Copyright (C) 2021 Internet Systems Consortium, Inc. ("ISC") +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# shellcheck disable=SC1091 +# SC1091: Not following: ... was not specified as input (see shellcheck -x). + +# Exit with error if commands exit with non-zero and if undefined variables are +# used. +set -eu + +# shellcheck disable=SC2034 +# SC2034: ... appears unused. Verify use (or export if used externally). +prefix="@prefix@" + +# Include utilities. Use installed version if available and +# use build version if it isn't. +if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then + . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh" +else + . "@abs_top_builddir@/src/bin/admin/admin-utils.sh" +fi + +# Check version. +version=$(mysql_version "${@}") +if test "${version}" != "11.0"; then + printf 'This script upgrades 11.0 to 12.0. ' + printf 'Reported version is %s. Skipping upgrade.\n' "${version}" + exit 0 +fi + +# Get the schema name from database argument. We need this to +# query information_schema for the right database. +for arg in "${@}" +do + if ! printf '%s' "${arg}" | grep -Eq '^\-\-' + then + schema="$arg" + break + fi +done + +# Make sure we have the schema. +if [ -z "$schema" ] +then + printf "Could not find database schema name in cmd line args: %s\n" "${*}" + exit 255 +fi + +mysql "$@" <