123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423 |
- #!/bin/sh
- # Copyright (C) 2014-2015 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/.
- # Include common test library.
- . @abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh
- # If the code is installed, include admin-utils.sh from the destination
- # directory. If not, include it from the sources.
- prefix=@prefix@
- if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
- . @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh
- else
- . @abs_top_srcdir@/src/bin/admin/admin-utils.sh
- fi
- db_user="keatest"
- db_password="keatest"
- db_name="keatest"
- # Set location of the kea-admin.
- keaadmin=@abs_top_builddir@/src/bin/admin/kea-admin
- # Wipe all tables from the DB:
- mysql_wipe() {
- printf "Wiping whole database %s\n" $db_name
- # ipv6_reservations table must be deleted first, as it has contraints that
- # are dependent on hosts. Therefore hosts table cannot be deleted before
- # ipv6_reservations.
- mysql_execute "DROP TABLE IF EXISTS ipv6_reservations;"
- # First we build the list of drop table commands
- # We don't bother with "cascade" because as of MySQL
- # 5.1 it is only there to ease porting, it doesn't
- # actually do anything.
- qry="\
- SELECT CONCAT('DROP TABLE ', table_schema, '.', table_name, ';') \
- FROM information_schema.tables \
- WHERE table_schema = 'keatest';"
- drop_sql=`mysql_execute "${qry}"`
- ERRCODE=$?
- assert_eq 0 $ERRCODE "mysql-wipe: table query failed, exit code %d, expected %d"
- # We need to turn off referrential integrity checks so tables
- # are dropped regardless of whether they are used in foreign keys.
- # (This is what cascade would normally do)
- mysql_execute "SET SESSION FOREIGN_KEY_CHECKS = 0;$drop_sql"
- ERRCODE=$?
- assert_eq 0 $ERRCODE "mysql-wipe: drop table sql failed, exit code %d, expected %d"
- }
- mysql_lease_init_test() {
- test_start "mysql.lease-init"
- # Let's wipe the whole database
- mysql_wipe
- # Ok, now let's initalize the database
- ${keaadmin} lease-init mysql -u $db_user -p $db_password -n $db_name -d @abs_top_srcdir@/src/bin/admin/scripts
- ERRCODE=$?
- assert_eq 0 $ERRCODE "kea-admin lease-init mysql returned non-zero status code %d, expected %d"
- # Ok, now let's check if the tables are indeed there.
- # First table: schema_version. Should have 2 columns: version and minor.
- mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
- SELECT version, minor FROM schema_version;
- EOF
- ERRCODE=$?
- assert_eq 0 $ERRCODE "schema_version table is missing or broken. (returned status code %d, expected %d)"
- # Second table: lease4
- mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
- SELECT address, hwaddr, client_id, valid_lifetime, expire, subnet_id, fqdn_fwd, fqdn_rev, hostname FROM lease4;
- EOF
- ERRCODE=$?
- assert_eq 0 $ERRCODE "lease4 table is missing or broken. (returned status code %d, expected %d)"
- # Third table: lease6
- mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
- SELECT address, duid, valid_lifetime, expire, subnet_id, pref_lifetime, lease_type, iaid, prefix_len, fqdn_fwd, fqdn_rev, hostname, hwaddr, hwtype, hwaddr_source FROM lease6;
- EOF
- ERRCODE=$?
- assert_eq 0 $ERRCODE "lease6 table is missing or broken. (returned status code %d, expected %d)"
- # Fourth table: lease6_types
- mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
- SELECT lease_type, name FROM lease6_types;
- EOF
- ERRCODE=$?
- assert_eq 0 $ERRCODE "lease6_types table is missing or broken. (returned status code %d, expected %d)"
- # Fifth table: lease_hwaddr_source
- mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
- SELECT hwaddr_source, name FROM lease_hwaddr_source;
- EOF
- ERRCODE=$?
- assert_eq 0 $ERRCODE "lease_hwaddr_source table is missing or broken. (returned status code %d, expected %d)"
- # Let's wipe the whole database
- mysql_wipe
- test_finish 0
- }
- mysql_lease_version_test() {
- test_start "mysql.lease-version"
- # Let's wipe the whole database
- mysql_wipe
- # Ok, now let's create a version 1.7
- mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
- CREATE TABLE schema_version (
- version INT PRIMARY KEY NOT NULL,
- minor INT
- );
- INSERT INTO schema_version VALUES (1, 7);
- EOF
- version=$(${keaadmin} lease-version mysql -u $db_user -p $db_password -n $db_name)
- assert_str_eq "1.7" ${version} "Expected kea-admin to return %s, returned value was %s"
- # Let's wipe the whole database
- mysql_wipe
- test_finish 0
- }
- mysql_host_reservation_init_test() {
- test_start "mysql.host_reservation-init"
- # Let's wipe the whole database
- mysql_wipe
- # Ok, now let's initalize the database
- ${keaadmin} lease-init mysql -u $db_user -p $db_password -n $db_name -d @abs_top_srcdir@/src/bin/admin/scripts
- ERRCODE=$?
- assert_eq 0 $ERRCODE "kea-admin lease-init mysql returned non-zero status code %d, expected %d"
- # Ok, now let's check if the tables are indeed there.
- # First table: schema_version. Should have 2 columns: version and minor.
- mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
- SELECT version, minor FROM schema_version;
- EOF
- ERRCODE=$?
- assert_eq 0 $ERRCODE "schema_version table is missing or broken. (returned status code %d, expected %d)"
- # Second table: hosts
- mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
- SELECT host_id, dhcp_identifier, dhcp_identifier_type, dhcp4_subnet_id, dhcp6_subnet_id, ipv4_address, hostname, dhcp4_client_classes, dhcp6_client_classes FROM hosts;
- EOF
- ERRCODE=$?
- assert_eq 0 $ERRCODE "hosts table is missing or broken. (returned status code %d, expected %d)"
- # Third table: ipv6_reservations
- mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
- SELECT reservation_id, address, prefix_len, type, dhcp6_iaid, host_id FROM ipv6_reservations;
- EOF
- ERRCODE=$?
- assert_eq 0 $ERRCODE "ipv6_reservations table is missing or broken. (returned status code %d, expected %d)"
- # Fourth table: dhcp4_options
- mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
- SELECT option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp4_subnet_id, host_id FROM dhcp4_options;
- EOF
- ERRCODE=$?
- assert_eq 0 $ERRCODE "dhcp4_options table is missing or broken. (returned status code %d, expected %d)"
- # Fifth table: dhcp6_options
- mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
- SELECT option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp6_subnet_id, host_id FROM dhcp6_options;
- EOF
- ERRCODE=$?
- assert_eq 0 $ERRCODE "dhcp6_options table is missing or broken. (returned status code %d, expected %d)"
- # Let's wipe the whole database
- mysql_wipe
- test_finish 0
- }
- mysql_upgrade_test() {
- test_start "mysql.host_reservation-upgrade"
- # Let's wipe the whole database
- mysql_wipe
- # Initialize database to scheme 1.0.
- mysql -u$db_user -p$db_password $db_name < @abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.mysql
- # Sanity check - verify that it reports version 1.0.
- version=$(${keaadmin} lease-version mysql -u $db_user -p $db_password -n $db_name -d @abs_top_srcdir@/src/bin/admin/scripts)
- 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 4.0
- ${keaadmin} lease-upgrade mysql -u $db_user -p $db_password -n $db_name -d @abs_top_srcdir@/src/bin/admin/scripts
- ERRCODE=$?
- assert_eq 0 $ERRCODE "kea-admin lease-upgrade mysql returned non-zero status code %d, expected %d"
- # Let's check that the new tables are indeed there.
- #table: lease6 (upgrade 1.0 -> 2.0)
- mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
- SELECT hwaddr, hwtype, hwaddr_source FROM lease6;
- EOF
- ERRCODE=$?
- assert_eq 0 $ERRCODE "lease6 table not upgraded to 2.0 (returned status code %d, expected %d)"
- #table: lease_hwaddr_source (upgrade 1.0 -> 2.0)
- mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
- SELECT hwaddr_source, name FROM lease_hwaddr_source;
- EOF
- ERRCODE=$?
- assert_eq 0 $ERRCODE "lease_hwaddr_source table is missing or broken. (returned status code %d, expected %d)"
- #table: hosts (upgrade 2.0 -> 3.0)
- mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
- SELECT host_id, dhcp_identifier, dhcp_identifier_type, dhcp4_subnet_id, dhcp6_subnet_id, ipv4_address, hostname, dhcp4_client_classes, dhcp6_client_classes FROM hosts;
- EOF
- ERRCODE=$?
- assert_eq 0 $ERRCODE "hosts table is missing or broken. (returned status code %d, expected %d)"
- #table: ipv6_reservations (upgrade 2.0 -> 3.0)
- mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
- SELECT reservation_id, address, prefix_len, type, dhcp6_iaid, host_id FROM ipv6_reservations;
- EOF
- ERRCODE=$?
- assert_eq 0 $ERRCODE "ipv6_reservations table is missing or broken. (returned status code %d, expected %d)"
- #table: dhcp4_options (upgrade 2.0 -> 3.0)
- mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
- SELECT option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp4_subnet_id, host_id FROM dhcp4_options;
- EOF
- ERRCODE=$?
- assert_eq 0 $ERRCODE "dhcp4_options table is missing or broken. (returned status code %d, expected %d)"
- #table: dhcp6_options (upgrade 2.0 -> 3.0)
- mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
- SELECT option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp6_subnet_id, host_id FROM dhcp6_options;
- EOF
- ERRCODE=$?
- assert_eq 0 $ERRCODE "dhcp6_options table is missing or broken. (returned status code %d, expected %d)"
- # Verify that it reports version 3.0.
- #table: lease_state table added (upgrade 3.0 -> 4.0)
- mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
- SELECT state,name from lease_state;
- EOF
- ERRCODE=$?
- assert_eq 0 $ERRCODE "dhcp6_options table is missing or broken. (returned status code %d, expected %d)"
- #table: state column added to lease4 (upgrade 3.0 -> 4.0)
- mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
- SELECT state from lease4;
- EOF
- ERRCODE=$?
- assert_eq 0 $ERRCODE "lease4 is missing state column. (returned status code %d, expected %d)"
- #table: state column added to lease6 (upgrade 3.0 -> 4.0)
- mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
- SELECT state from lease6;
- EOF
- ERRCODE=$?
- assert_eq 0 $ERRCODE "lease6 is missing state column. (returned status code %d, expected %d)"
- #table: stored procedures for lease dumps added (upgrade 3.0 -> 4.0)
- mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
- call lease4DumpHeader(); call lease4DumpData(); call lease6DumpHeader(); call lease6DumpHeader();
- EOF
- ERRCODE=$?
- assert_eq 0 $ERRCODE "lease dump stored procedures are missing or broken. (returned status code %d, expected %d)"
- # Verify that it reports version 4.0.
- version=$(${keaadmin} lease-version mysql -u $db_user -p $db_password -n $db_name)
- assert_str_eq "4.0" ${version} "Expected kea-admin to return %s, returned value was %s"
- # Let's wipe the whole database
- mysql_wipe
- test_finish 0
- }
- mysql_lease4_dump_test() {
- test_start "mysql.lease4_dump_test"
- test_dir="@abs_top_srcdir@/src/bin/admin/tests"
- output_dir="@abs_top_builddir@/src/bin/admin/tests"
- script_dir="@abs_top_srcdir@/src/bin/admin/scripts"
- output_file="$output_dir/data/mysql.lease4_dump_test.output.csv"
- tmp_file="$output_file.tmp"
- ref_file="$test_dir/data/mysql.lease4_dump_test.reference.csv"
- # wipe out any residuals from prior failed runs
- if [ -e $output_file ]
- then
- rm $output_file
- fi
- if [ -e $tmp_file ]
- then
- rm $tmp_file
- fi
- # Let's wipe the whole database
- mysql_wipe
- # Ok, now let's initalize the database
- ${keaadmin} lease-init mysql -u $db_user -p $db_password -n $db_name -d $script_dir
- ERRCODE=$?
- assert_eq 0 $ERRCODE "could not create database, expected exit code %d, actual %d"
- # Insert the reference record
- insert_sql="\
- insert into lease4 values(10,20,30,40,\"2015-01-01 01:15:30\",50,1,1,\"one.example.com\", 0);\
- insert into lease4 values(11,NULL,123,40,\"2015-02-02 02:30:45\",50,1,1,\"\", 1);\
- insert into lease4 values(12,22,NULL,40,\"2015-03-03 11:01:07\",50,1,1,\"three.example.com\", 2);"
- mysql_execute "$insert_sql"
- ERRCODE=$?
- assert_eq 0 $ERRCODE "insert into lease4 failed, expected exit code %d, actual %d"
- # Dump lease4 to output_file
- ${keaadmin} lease-dump mysql -4 -u $db_user -p $db_password -n $db_name -d $script_dir -o $output_file
- ERRCODE=$?
- assert_eq 0 $ERRCODE "kea-admin lease-dump -4 failed, expected exit code %d, actual %d"
- # Compare the dump output to reference file, they should be identical
- cmp -s $output_file $ref_file
- ERRCODE=$?
- assert_eq 0 $ERRCODE "dump file does not match reference file, expected exit code %d, actual %d"
- # remove the output file
- rm $output_file
- # Let's wipe the whole database
- mysql_wipe
- test_finish 0
- }
- mysql_lease6_dump_test() {
- test_start "mysql.lease6_dump_test"
- test_dir="@abs_top_srcdir@/src/bin/admin/tests"
- output_dir="@abs_top_builddir@/src/bin/admin/tests"
- script_dir="@abs_top_srcdir@/src/bin/admin/scripts"
- output_file="$output_dir/data/mysql.lease6_dump_test.output.csv"
- tmp_file="$output_file.tmp"
- ref_file="$test_dir/data/mysql.lease6_dump_test.reference.csv"
- # wipe out any residuals from prior failed runs
- if [ -e $output_file ]
- then
- rm $output_file
- fi
- if [ -e $tmp_file ]
- then
- rm $tmp_file
- fi
- # Let's wipe the whole database
- mysql_wipe
- # Ok, now let's initalize the database
- ${keaadmin} lease-init mysql -u $db_user -p $db_password -n $db_name -d $script_dir
- ERRCODE=$?
- assert_eq 0 $ERRCODE "could not create database, expected exit code %d, actual %d"
- # Insert the reference record
- insert_sql="\
- insert into lease6 values(10,20,30,\"2015-04-04 01:15:30\",40,50,1,60,70,1,1,\"one.example.com\",80,90,16,0);\
- insert into lease6 values(11,NULL,30,\"2015-05-05 02:30:45\",40,50,1,60,70,1,1,\"\",80,90,1,1);\
- insert into lease6 values(12,21,30,\"2015-06-06 11:01:07\",40,50,1,60,70,1,1,\"three.example.com\",80,90,4,2);"
- mysql_execute "$insert_sql"
- ERRCODE=$?
- assert_eq 0 $ERRCODE "insert into lease6 failed, expected exit code %d, actual %d"
- # Dump lease4 to output_file
- ${keaadmin} lease-dump mysql -6 -u $db_user -p $db_password -n $db_name -d $script_dir -o $output_file
- ERRCODE=$?
- assert_eq 0 $ERRCODE "kea-admin lease-dump -6 failed, status code %d"
- # Compare the dump output to reference file, they should be identical
- cmp -s $output_file $ref_file
- ERRCODE=$?
- assert_eq 0 $ERRCODE "dump file does not match reference file, expected exit code %d, actual %d"
- # remove the output file
- rm $output_file
- # Let's wipe the whole database
- mysql_wipe
- test_finish 0
- }
- mysql_lease_init_test
- mysql_host_reservation_init_test
- mysql_lease_version_test
- mysql_upgrade_test
- mysql_lease4_dump_test
- mysql_lease6_dump_test
|