2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-09-03 23:45:27 +00:00

[#526,!269] - MySQL unit tests now wipe data, instead of schema

src/share/database/scripts/mysql/wipe_data.sh.in -
    New shell script which intelligently deletes data from
    the schema IF the schema version matches the expected version

src/lib/mysql/testutils/mysql_schema.*
    destroyMySQLSchema() - modfied to default to calling
    wipeData(), and only destroying the schema if that fails
    or by force flag = true;

    createMySQLSchema() - modified to default to calling
    wipeData(), and only recreating the schema if that
    fails or by force flag = true;

    wipeData() - new method which runs the
    MySQL wipe_data.sh shell script, passing in the expected
    schema version.

src/share/database/scripts/mysql/dhcpdb_create.mysql
    createAuditRevisionDHCP4()
    createAuditEntryDHCP4()
    createAuditRevisionDHCP6()
    createAuditEntryDHCP6() - added session variable,
    @disable_audit, to allow procedures to be "turned
    off" during data wiping.

src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_mgr_unittest.cc
src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc
src/lib/dhcpsrv/tests/cfg_db_access_unittest.cc
src/lib/dhcpsrv/tests/host_mgr_unittest.cc
src/lib/dhcpsrv/tests/mysql_host_data_source_unittest.cc
src/lib/dhcpsrv/tests/mysql_lease_mgr_unittest.cc
    Removed calls to destroy schema from test constructors
This commit is contained in:
Thomas Markwalder
2019-03-08 12:06:38 -05:00
parent 723efb56e8
commit 6af5e78ec8
13 changed files with 248 additions and 60 deletions

View File

@@ -13,6 +13,7 @@ sqlscripts_DATA += upgrade_5.1_to_5.2.sh
sqlscripts_DATA += upgrade_5.2_to_6.0.sh
sqlscripts_DATA += upgrade_6.0_to_7.0.sh
sqlscripts_DATA += upgrade_7.0_to_8.0.sh
sqlscripts_DATA += wipe_data.sh
DISTCLEANFILES = upgrade_1.0_to_2.0.sh
DISTCLEANFILES += upgrade_2.0_to_3.0.sh
@@ -24,5 +25,6 @@ DISTCLEANFILES += upgrade_5.1_to_5.2.sh
DISTCLEANFILES += upgrade_5.2_to_6.0.sh
DISTCLEANFILES += upgrade_6.0_to_7.0.sh
DISTCLEANFILES += upgrade_7.0_to_8.0.sh
DISTCLEANFILES += wipe_data.sh
EXTRA_DIST = ${sqlscripts_DATA}

View File

@@ -1543,6 +1543,10 @@ ALTER TABLE dhcp4_audit
-- hand, if the global option is being added, the
-- audit entry for the option must be created because
-- it is the sole object modified in that case.
-- Session variable disable_audit is used to disable
-- the procedure when wiping the database during
-- unit tests. This avoids issues with revision_id
-- being null.
-- -----------------------------------------------------
DROP PROCEDURE IF EXISTS createAuditRevisionDHCP4;
DELIMITER $$
@@ -1552,11 +1556,13 @@ CREATE PROCEDURE createAuditRevisionDHCP4(IN audit_ts TIMESTAMP,
IN cascade_transaction TINYINT(1))
BEGIN
DECLARE srv_id BIGINT(20);
SELECT id INTO srv_id FROM dhcp4_server WHERE tag = server_tag;
INSERT INTO dhcp4_audit_revision (modification_ts, server_id, log_message)
VALUES (audit_ts, srv_id, audit_log_message);
SET @audit_revision_id = LAST_INSERT_ID();
SET @cascade_transaction = cascade_transaction;
IF @disable_audit IS NULL OR @disable_audit = 0 THEN
SELECT id INTO srv_id FROM dhcp4_server WHERE tag = server_tag;
INSERT INTO dhcp4_audit_revision (modification_ts, server_id, log_message)
VALUES (audit_ts, srv_id, audit_log_message);
SET @audit_revision_id = LAST_INSERT_ID();
SET @cascade_transaction = cascade_transaction;
END IF;
END $$
DELIMITER ;
@@ -1575,6 +1581,10 @@ DELIMITER ;
-- - modification_type_val: string value indicating the
-- type of the change, i.e. "create", "update" or
-- "delete".
-- Session variable disable_audit is used to disable
-- the procedure when wiping the database during
-- unit tests. This avoids issues with revision_id
-- being null.
-- ----------------------------------------------------
DROP PROCEDURE IF EXISTS createAuditEntryDHCP4;
DELIMITER $$
@@ -1582,10 +1592,12 @@ CREATE PROCEDURE createAuditEntryDHCP4(IN object_type_val VARCHAR(256),
IN object_id_val BIGINT(20) UNSIGNED,
IN modification_type_val VARCHAR(32))
BEGIN
INSERT INTO dhcp4_audit (object_type, object_id, modification_type, revision_id)
VALUES (object_type_val, object_id_val, \
IF @disable_audit IS NULL OR @disable_audit = 0 THEN
INSERT INTO dhcp4_audit (object_type, object_id, modification_type, revision_id)
VALUES (object_type_val, object_id_val, \
(SELECT id FROM modification WHERE modification_type = modification_type_val), \
@audit_revision_id);
END IF;
END $$
DELIMITER ;
@@ -1955,6 +1967,10 @@ ALTER TABLE dhcp6_audit
-- hand, if the global option is being added, the
-- audit entry for the option must be created because
-- it is the sole object modified in that case.
-- Session variable disable_audit is used to disable
-- the procedure when wiping the database during
-- unit tests. This avoids issues with revision_id
-- being null.
-- -----------------------------------------------------
DROP PROCEDURE IF EXISTS createAuditRevisionDHCP6;
DELIMITER $$
@@ -1964,11 +1980,13 @@ CREATE PROCEDURE createAuditRevisionDHCP6(IN audit_ts TIMESTAMP,
IN cascade_transaction TINYINT(1))
BEGIN
DECLARE srv_id BIGINT(20);
SELECT id INTO srv_id FROM dhcp6_server WHERE tag = server_tag;
INSERT INTO dhcp6_audit_revision (modification_ts, server_id, log_message)
VALUES (audit_ts, srv_id, audit_log_message);
SET @audit_revision_id = LAST_INSERT_ID();
SET @cascade_transaction = cascade_transaction;
IF @disable_audit IS NULL OR @disable_audit = 0 THEN
SELECT id INTO srv_id FROM dhcp6_server WHERE tag = server_tag;
INSERT INTO dhcp6_audit_revision (modification_ts, server_id, log_message)
VALUES (audit_ts, srv_id, audit_log_message);
SET @audit_revision_id = LAST_INSERT_ID();
SET @cascade_transaction = cascade_transaction;
END IF;
END $$
DELIMITER ;
@@ -1987,6 +2005,10 @@ DELIMITER ;
-- - modification_type_val: string value indicating the
-- type of the change, i.e. "create", "update" or
-- "delete".
-- Session variable disable_audit is used to disable
-- the procedure when wiping the database during
-- unit tests. This avoids issues with revision_id
-- being null.
-- ----------------------------------------------------
DROP PROCEDURE IF EXISTS createAuditEntryDHCP6;
DELIMITER $$
@@ -1994,10 +2016,12 @@ CREATE PROCEDURE createAuditEntryDHCP6(IN object_type_val VARCHAR(256),
IN object_id_val BIGINT(20) UNSIGNED,
IN modification_type_val VARCHAR(32))
BEGIN
INSERT INTO dhcp6_audit (object_type, object_id, modification_type, revision_id)
VALUES (object_type_val, object_id_val, \
IF @disable_audit IS NULL OR @disable_audit = 0 THEN
INSERT INTO dhcp6_audit (object_type, object_id, modification_type, revision_id)
VALUES (object_type_val, object_id_val, \
(SELECT id FROM modification WHERE modification_type = modification_type_val), \
@audit_revision_id);
END IF;
END $$
DELIMITER ;

View File

@@ -225,6 +225,10 @@ ALTER TABLE dhcp4_audit
-- hand, if the global option is being added, the
-- audit entry for the option must be created because
-- it is the sole object modified in that case.
-- Session variable disable_audit is used to disable
-- the procedure when wiping the database during
-- unit tests. This avoids issues with revision_id
-- being null.
-- -----------------------------------------------------
DROP PROCEDURE IF EXISTS createAuditRevisionDHCP4;
DELIMITER $$
@@ -234,11 +238,13 @@ CREATE PROCEDURE createAuditRevisionDHCP4(IN audit_ts TIMESTAMP,
IN cascade_transaction TINYINT(1))
BEGIN
DECLARE srv_id BIGINT(20);
SELECT id INTO srv_id FROM dhcp4_server WHERE tag = server_tag;
INSERT INTO dhcp4_audit_revision (modification_ts, server_id, log_message)
VALUES (audit_ts, srv_id, audit_log_message);
SET @audit_revision_id = LAST_INSERT_ID();
SET @cascade_transaction = cascade_transaction;
IF @disable_audit IS NULL OR @disable_audit = 0 THEN
SELECT id INTO srv_id FROM dhcp4_server WHERE tag = server_tag;
INSERT INTO dhcp4_audit_revision (modification_ts, server_id, log_message)
VALUES (audit_ts, srv_id, audit_log_message);
SET @audit_revision_id = LAST_INSERT_ID();
SET @cascade_transaction = cascade_transaction;
END IF;
END $$
DELIMITER ;
@@ -257,6 +263,10 @@ DELIMITER ;
-- - modification_type_val: string value indicating the
-- type of the change, i.e. "create", "update" or
-- "delete".
-- Session variable disable_audit is used to disable
-- the procedure when wiping the database during
-- unit tests. This avoids issues with revision_id
-- being null.
-- ----------------------------------------------------
DROP PROCEDURE IF EXISTS createAuditEntryDHCP4;
DELIMITER $$
@@ -264,10 +274,12 @@ CREATE PROCEDURE createAuditEntryDHCP4(IN object_type_val VARCHAR(256),
IN object_id_val BIGINT(20) UNSIGNED,
IN modification_type_val VARCHAR(32))
BEGIN
INSERT INTO dhcp4_audit (object_type, object_id, modification_type, revision_id)
VALUES (object_type_val, object_id_val, \
(SELECT id FROM modification WHERE modification_type = modification_type_val), \
@audit_revision_id);
IF @disable_audit IS NULL OR @disable_audit = 0 THEN
INSERT INTO dhcp4_audit (object_type, object_id, modification_type, revision_id)
VALUES (object_type_val, object_id_val, \
(SELECT id FROM modification WHERE modification_type = modification_type_val), \
@audit_revision_id);
END IF;
END $$
DELIMITER ;
@@ -637,6 +649,10 @@ ALTER TABLE dhcp6_audit
-- hand, if the global option is being added, the
-- audit entry for the option must be created because
-- it is the sole object modified in that case.
-- Session variable disable_audit is used to disable
-- the procedure when wiping the database during
-- unit tests. This avoids issues with revision_id
-- being null.
-- -----------------------------------------------------
DROP PROCEDURE IF EXISTS createAuditRevisionDHCP6;
DELIMITER $$
@@ -646,11 +662,13 @@ CREATE PROCEDURE createAuditRevisionDHCP6(IN audit_ts TIMESTAMP,
IN cascade_transaction TINYINT(1))
BEGIN
DECLARE srv_id BIGINT(20);
SELECT id INTO srv_id FROM dhcp6_server WHERE tag = server_tag;
INSERT INTO dhcp6_audit_revision (modification_ts, server_id, log_message)
VALUES (audit_ts, srv_id, audit_log_message);
SET @audit_revision_id = LAST_INSERT_ID();
SET @cascade_transaction = cascade_transaction;
IF @disable_audit IS NULL OR @disable_audit = 0 THEN
SELECT id INTO srv_id FROM dhcp6_server WHERE tag = server_tag;
INSERT INTO dhcp6_audit_revision (modification_ts, server_id, log_message)
VALUES (audit_ts, srv_id, audit_log_message);
SET @audit_revision_id = LAST_INSERT_ID();
SET @cascade_transaction = cascade_transaction;
END IF;
END $$
DELIMITER ;
@@ -669,6 +687,10 @@ DELIMITER ;
-- - modification_type_val: string value indicating the
-- type of the change, i.e. "create", "update" or
-- "delete".
-- Session variable disable_audit is used to disable
-- the procedure when wiping the database during
-- unit tests. This avoids issues with revision_id
-- being null.
-- ----------------------------------------------------
DROP PROCEDURE IF EXISTS createAuditEntryDHCP6;
DELIMITER $$
@@ -676,10 +698,12 @@ CREATE PROCEDURE createAuditEntryDHCP6(IN object_type_val VARCHAR(256),
IN object_id_val BIGINT(20) UNSIGNED,
IN modification_type_val VARCHAR(32))
BEGIN
INSERT INTO dhcp6_audit (object_type, object_id, modification_type, revision_id)
VALUES (object_type_val, object_id_val, \
IF @disable_audit IS NULL OR @disable_audit = 0 THEN
INSERT INTO dhcp6_audit (object_type, object_id, modification_type, revision_id)
VALUES (object_type_val, object_id_val, \
(SELECT id FROM modification WHERE modification_type = modification_type_val), \
@audit_revision_id);
END IF;
END $$
DELIMITER ;

View File

@@ -0,0 +1,90 @@
# Copyright (C) 2019 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/.
#!/bin/sh
# This script is primarily used for MySQL unit tests, which need to
# ensure an empty, but schema correct database for each test. It
# deletes ALL transient data from an existing Kea MySQL schema,
# including leases, reservations, etc... Use at your own peril.
# Reference tables will be left in-tact.
# 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
# First argument is must be the expected schema version <major>.<minor>
exp_version="$1"
shift;
# Remaining arguments are used as mysql command line arguments
# If the existing schema doesn't match, the fail
VERSION=`mysql_version "$@"`
if [ "$VERSION" != "$exp_version" ]; then
printf "Reported version is $VERSION is wrong, expected $exp_version.\n"
exit 1
fi
# Delete transient data from tables. Per MySQL documentation TRUNCATE
# destroys and there recreates tables. As schema updates are typically
# very slow, we're use deletes here. We turn off foreign key checks to
# worrying about table order. We also set the session variable
# disable_audit to turn off Back audit procedures, to avoid attempting
# to create entries for deleted records.
mysql "$@" <<EOF
START TRANSACTION;
SET SESSION FOREIGN_KEY_CHECKS = 0;
SET @disable_audit = 1;
DELETE FROM dhcp4_global_parameter;
DELETE FROM dhcp4_global_parameter_server;
DELETE FROM dhcp4_option_def;
DELETE FROM dhcp4_option_def_server;
DELETE FROM dhcp4_options;
DELETE FROM dhcp4_options_server;
DELETE FROM dhcp4_pool;
# preserve special server "all"
DELETE FROM dhcp4_server WHERE tag != "all";
DELETE FROM dhcp4_shared_network;
DELETE FROM dhcp4_shared_network_server;
DELETE FROM dhcp4_subnet;
DELETE FROM dhcp4_subnet_server;
DELETE FROM dhcp4_audit_revision;
DELETE FROM dhcp4_audit;
DELETE FROM dhcp6_global_parameter;
DELETE FROM dhcp6_global_parameter_server;
DELETE FROM dhcp6_option_def;
DELETE FROM dhcp6_option_def_server;
DELETE FROM dhcp6_options;
DELETE FROM dhcp6_options_server;
DELETE FROM dhcp6_pd_pool;
DELETE FROM dhcp6_pool;
# preserve special server "all"
DELETE FROM dhcp6_server WHERE tag != "all";
DELETE FROM dhcp6_shared_network;
DELETE FROM dhcp6_shared_network_server;
DELETE FROM dhcp6_subnet;
DELETE FROM dhcp6_subnet_server;
DELETE FROM dhcp6_audit;
DELETE FROM dhcp6_audit_revision;
DELETE FROM hosts;
DELETE FROM ipv6_reservations;
DELETE FROM lease4;
DELETE FROM lease4_stat;
DELETE FROM lease6;
DELETE FROM lease6_stat;
DELETE FROM logs;
COMMIT;
EOF
RESULT=$?
exit $RESULT