From: Thomas Markwalder Date: Thu, 22 Feb 2018 18:13:34 +0000 (-0500) Subject: [5522] Fixed subnet_id column types in MySQL and Postgres schemas X-Git-Tag: ha_checkpoints12~8^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=993da9cb0ba03a433e519ffbb99903213cc745f6;p=thirdparty%2Fkea.git [5522] Fixed subnet_id column types in MySQL and Postgres schemas new file: src/share/database/scripts/mysql/upgrade_5.1_to_5.2.sh.in renamed: src/share/database/scripts/mysql/upgrade_5.1_to_6.0.sh.in -> src/share/database/scripts/mysql/upgrade_5.2_to_6.0.sh.in new file: src/share/database/scripts/pgsql/upgrade_3.2_to_3.3.sh.in renamed: src/share/database/scripts/pgsql/upgrade_3.2_to_4.0.sh.in -> src/share/database/scripts/pgsql/upgrade_3.3_to_4.0.sh.in src/lib/dhcpsrv/pgsql_host_data_source.cc changed OID_INT4 to OID_INT8 for subnet_id inputs in TaggedStatements src/lib/dhcpsrv/tests/generic_host_data_source_unittest.h src/lib/dhcpsrv/tests/generic_host_data_source_unittest.cc src/lib/dhcpsrv/tests/mysql_host_data_source_unittest.cc src/lib/dhcpsrv/tests/pgsql_host_data_source_unittest.cc Added new tests to verify maxium value for subnet_id works src/share/database/scripts/mysql/dhcpdb_create.mysql Added 5.1 to 5.2 changes src/share/database/scripts/pgsql/dhcpdb_create.pgsql Added 3.2 to 3.3 changes --- diff --git a/configure.ac b/configure.ac index 3c332fd7fd..9604abcfab 100644 --- a/configure.ac +++ b/configure.ac @@ -1445,13 +1445,15 @@ AC_CONFIG_FILES([Makefile src/share/database/scripts/mysql/upgrade_4.0_to_4.1.sh src/share/database/scripts/mysql/upgrade_4.1_to_5.0.sh src/share/database/scripts/mysql/upgrade_5.0_to_5.1.sh - src/share/database/scripts/mysql/upgrade_5.1_to_6.0.sh + src/share/database/scripts/mysql/upgrade_5.1_to_5.2.sh + src/share/database/scripts/mysql/upgrade_5.2_to_6.0.sh src/share/database/scripts/pgsql/Makefile src/share/database/scripts/pgsql/upgrade_1.0_to_2.0.sh src/share/database/scripts/pgsql/upgrade_2.0_to_3.0.sh src/share/database/scripts/pgsql/upgrade_3.0_to_3.1.sh src/share/database/scripts/pgsql/upgrade_3.1_to_3.2.sh - src/share/database/scripts/pgsql/upgrade_3.2_to_4.0.sh + src/share/database/scripts/pgsql/upgrade_3.2_to_3.3.sh + src/share/database/scripts/pgsql/upgrade_3.3_to_4.0.sh tools/Makefile tools/path_replacer.sh ]) diff --git a/src/bin/admin/tests/mysql_tests.sh.in b/src/bin/admin/tests/mysql_tests.sh.in index e5233c338d..8fc4b44558 100644 --- a/src/bin/admin/tests/mysql_tests.sh.in +++ b/src/bin/admin/tests/mysql_tests.sh.in @@ -363,7 +363,7 @@ EOF assert_eq 0 $ERRCODE "select from host_identifier_type failed. (expected status code %d, returned %d)" assert_eq 5 "$count" "host_identifier_type does not contain correct number of entries. (expected count %d, returned %d)" - #table: user_context columns to hosts, dhcp4_options and dhcp6_options (upgrade 5.1 -> 6.0) + #table: user_context columns to hosts, dhcp4_options and dhcp6_options (upgrade 5.2 -> 6.0) # verify that hosts table includes user_context qry="select user_context from hosts"; count=`mysql_execute "${qry}"` diff --git a/src/lib/dhcpsrv/pgsql_host_data_source.cc b/src/lib/dhcpsrv/pgsql_host_data_source.cc index 252f22cc4c..1df0be6f5c 100644 --- a/src/lib/dhcpsrv/pgsql_host_data_source.cc +++ b/src/lib/dhcpsrv/pgsql_host_data_source.cc @@ -1497,7 +1497,7 @@ TaggedStatementArray tagged_statements = { { // and client's identifier. Left joining the dhcp4_options table results in // multiple rows being returned for the same host. {3, - { OID_INT4, OID_INT2, OID_BYTEA }, + { OID_INT8, OID_INT2, OID_BYTEA }, "get_host_subid4_dhcpid", "SELECT h.host_id, h.dhcp_identifier, h.dhcp_identifier_type, " " h.dhcp4_subnet_id, h.dhcp6_subnet_id, h.ipv4_address, h.hostname, " @@ -1517,7 +1517,7 @@ TaggedStatementArray tagged_statements = { { // associated with a host. The number of rows returned is a multiplication // of number of IPv6 reservations and DHCPv6 options. {3, - { OID_INT4, OID_INT2, OID_BYTEA }, + { OID_INT8, OID_INT2, OID_BYTEA }, "get_host_subid6_dhcpid", "SELECT h.host_id, h.dhcp_identifier, " " h.dhcp_identifier_type, h.dhcp4_subnet_id, " @@ -1541,7 +1541,7 @@ TaggedStatementArray tagged_statements = { { // results in multiple rows being returned for the host. The number of // rows depends on the number of options defined for the host. {2, - { OID_INT4, OID_INT8 }, + { OID_INT8, OID_INT8 }, "get_host_subid_addr", "SELECT h.host_id, h.dhcp_identifier, h.dhcp_identifier_type, " " h.dhcp4_subnet_id, h.dhcp6_subnet_id, h.ipv4_address, h.hostname, " @@ -1591,7 +1591,7 @@ TaggedStatementArray tagged_statements = { { // The number of rows returned is multiplication of number of existing // IPv6 reservations and DHCPv6 options. {2, - { OID_INT4, OID_VARCHAR }, + { OID_INT8, OID_VARCHAR }, "get_host_subid6_addr", "SELECT h.host_id, h.dhcp_identifier, " " h.dhcp_identifier_type, h.dhcp4_subnet_id, " @@ -1621,7 +1621,7 @@ TaggedStatementArray tagged_statements = { { // Inserts a host into the 'hosts' table. Returns the inserted host id. {12, { OID_BYTEA, OID_INT2, - OID_INT4, OID_INT4, OID_INT8, OID_VARCHAR, + OID_INT8, OID_INT8, OID_INT8, OID_VARCHAR, OID_VARCHAR, OID_VARCHAR, OID_TEXT }, "insert_host", "INSERT INTO hosts(dhcp_identifier, dhcp_identifier_type, " @@ -1669,7 +1669,7 @@ TaggedStatementArray tagged_statements = { { // PgSqlHostDataSourceImpl::DEL_HOST_ADDR4 // Deletes a v4 host that matches (subnet-id, addr4) {2, - { OID_INT4, OID_INT8 }, + { OID_INT8, OID_INT8 }, "del_host_addr4", "DELETE FROM hosts WHERE dhcp4_subnet_id = $1 AND ipv4_address = $2" }, @@ -1677,7 +1677,7 @@ TaggedStatementArray tagged_statements = { { // PgSqlHostDataSourceImpl::DEL_HOST_SUBID4_ID // Deletes a v4 host that matches (subnet4-id, identifier-type, identifier) {3, - { OID_INT4, OID_INT2, OID_BYTEA }, + { OID_INT8, OID_INT2, OID_BYTEA }, "del_host_subid4_id", "DELETE FROM hosts WHERE dhcp4_subnet_id = $1 " "AND dhcp_identifier_type = $2 " @@ -1687,7 +1687,7 @@ TaggedStatementArray tagged_statements = { { // PgSqlHostDataSourceImpl::DEL_HOST_SUBID6_ID // Deletes a v6 host that matches (subnet6-id, identifier-type, identifier) {3, - { OID_INT4, OID_INT2, OID_BYTEA }, + { OID_INT8, OID_INT2, OID_BYTEA }, "del_host_subid6_id", "DELETE FROM hosts WHERE dhcp6_subnet_id = $1 " "AND dhcp_identifier_type = $2 " diff --git a/src/lib/dhcpsrv/tests/generic_host_data_source_unittest.cc b/src/lib/dhcpsrv/tests/generic_host_data_source_unittest.cc index 646e0ee462..02a8e8512e 100644 --- a/src/lib/dhcpsrv/tests/generic_host_data_source_unittest.cc +++ b/src/lib/dhcpsrv/tests/generic_host_data_source_unittest.cc @@ -18,7 +18,6 @@ #include #include #include - #include #include #include @@ -258,6 +257,67 @@ GenericHostDataSourceTest::testBasic4(const Host::IdentifierType& id) { HostDataSourceUtils::compareHosts(host, from_hds); } +void +GenericHostDataSourceTest::testMaxSubnetId4() { + std::vector ident; + + ident = HostDataSourceUtils::generateIdentifier(); + SubnetID subnet_id4 = numeric_limits::max(); + HostPtr host(new Host(&ident[0], ident.size(), Host::IDENT_DUID, + subnet_id4, 0, IOAddress("0.0.0.0"))); + + ASSERT_NO_THROW(addTestOptions(host, true, DHCP4_ONLY)); + ASSERT_NO_THROW(hdsptr_->add(host)); + + // get4(subnet_id, identifier_type, identifier, identifier_size) + ConstHostPtr host_by_id = hdsptr_->get4(subnet_id4, + host->getIdentifierType(), + &host->getIdentifier()[0], + host->getIdentifier().size()); + + ASSERT_NO_FATAL_FAILURE(HostDataSourceUtils::compareHosts(host, host_by_id)); + + // Now try to delete it: del4(subnet4-id, identifier-type, identifier) + EXPECT_TRUE(hdsptr_->del4(subnet_id4, Host::IDENT_DUID, &ident[0], + ident.size())); + + host_by_id = hdsptr_->get4(subnet_id4, host->getIdentifierType(), + &host->getIdentifier()[0], + host->getIdentifier().size()); + + EXPECT_FALSE(host_by_id); +} + +void GenericHostDataSourceTest::testMaxSubnetId6() { + std::vector ident; + + ident = HostDataSourceUtils::generateIdentifier(); + SubnetID subnet_id6 = numeric_limits::max(); + HostPtr host(new Host(&ident[0], ident.size(), Host::IDENT_DUID, + 0, subnet_id6, IOAddress("0.0.0.0"))); + + ASSERT_NO_THROW(addTestOptions(host, true, DHCP6_ONLY)); + ASSERT_NO_THROW(hdsptr_->add(host)); + + // get6(subnet_id, identifier_type, identifier, identifier_size) + ConstHostPtr host_by_id = hdsptr_->get6(subnet_id6, + host->getIdentifierType(), + &host->getIdentifier()[0], + host->getIdentifier().size()); + + ASSERT_NO_FATAL_FAILURE(HostDataSourceUtils::compareHosts(host, host_by_id)); + + // Now try to delete it: del6(subnet6-id, identifier-type, identifier) + EXPECT_TRUE(hdsptr_->del6(subnet_id6, Host::IDENT_DUID, &ident[0], + ident.size())); + + host_by_id = hdsptr_->get4(subnet_id6, host->getIdentifierType(), + &host->getIdentifier()[0], + host->getIdentifier().size()); + + EXPECT_FALSE(host_by_id); +} + void GenericHostDataSourceTest::testGetByIPv4(const Host::IdentifierType& id) { // Make sure we have a pointer to the host data source. diff --git a/src/lib/dhcpsrv/tests/generic_host_data_source_unittest.h b/src/lib/dhcpsrv/tests/generic_host_data_source_unittest.h index 9a507cdc1b..250943f5f1 100644 --- a/src/lib/dhcpsrv/tests/generic_host_data_source_unittest.h +++ b/src/lib/dhcpsrv/tests/generic_host_data_source_unittest.h @@ -312,6 +312,19 @@ public: /// @param id Identifier type. void testBasic4(const Host::IdentifierType& id); + + /// @brief Test that Verifies that an IPv4 host reservation with + /// options can have a max value for dhcp4_subnet id + /// + /// Uses gtest macros to report failures. + void testMaxSubnetId4(); + + /// @brief Test that Verifies that an IPv6 host reservation with + /// options can have a max value for dhcp6_subnet id + /// + /// Uses gtest macros to report failures. + void testMaxSubnetId6(); + /// @brief Test inserts several hosts with unique IPv4 address and /// checks that they can be retrieved properly. /// diff --git a/src/lib/dhcpsrv/tests/mysql_host_data_source_unittest.cc b/src/lib/dhcpsrv/tests/mysql_host_data_source_unittest.cc index e40d965c07..93014ffb68 100644 --- a/src/lib/dhcpsrv/tests/mysql_host_data_source_unittest.cc +++ b/src/lib/dhcpsrv/tests/mysql_host_data_source_unittest.cc @@ -273,6 +273,18 @@ TEST_F(MySqlHostDataSourceTest, basic4HWAddr) { testBasic4(Host::IDENT_HWADDR); } +// Verifies that IPv4 host reservation with options can have a max value +// for dhcp4_subnet id +TEST_F(MySqlHostDataSourceTest, maxSubnetId4) { + testMaxSubnetId4(); +} + +// Verifies that IPv6 host reservation with options can have a max value +// for dhcp6_subnet id +TEST_F(MySqlHostDataSourceTest, maxSubnetId6) { + testMaxSubnetId6(); +} + // Test verifies if a host reservation can be added and later retrieved by IPv4 // address. Host uses client-id (DUID) as identifier. TEST_F(MySqlHostDataSourceTest, basic4ClientId) { diff --git a/src/lib/dhcpsrv/tests/pgsql_host_data_source_unittest.cc b/src/lib/dhcpsrv/tests/pgsql_host_data_source_unittest.cc index f575f5f50c..219c577950 100644 --- a/src/lib/dhcpsrv/tests/pgsql_host_data_source_unittest.cc +++ b/src/lib/dhcpsrv/tests/pgsql_host_data_source_unittest.cc @@ -229,6 +229,18 @@ TEST_F(PgSqlHostDataSourceTest, basic4HWAddr) { testBasic4(Host::IDENT_HWADDR); } +// Verifies that IPv4 host reservation with options can have a max value +// for dhcp4_subnet id +TEST_F(PgSqlHostDataSourceTest, maxSubnetId4) { + testMaxSubnetId4(); +} + +// Verifies that IPv6 host reservation with options can have a max value +// for dhcp6_subnet id +TEST_F(PgSqlHostDataSourceTest, maxSubnetId6) { + testMaxSubnetId6(); +} + // Test verifies if a host reservation can be added and later retrieved by IPv4 // address. Host uses client-id (DUID) as identifier. TEST_F(PgSqlHostDataSourceTest, basic4ClientId) { diff --git a/src/share/database/scripts/mysql/.gitignore b/src/share/database/scripts/mysql/.gitignore index b5670c1823..8f9f1ce2bc 100644 --- a/src/share/database/scripts/mysql/.gitignore +++ b/src/share/database/scripts/mysql/.gitignore @@ -4,4 +4,5 @@ /upgrade_4.0_to_4.1.sh /upgrade_4.1_to_5.0.sh /upgrade_5.0_to_5.1.sh -/upgrade_5.1_to_6.0.sh +/upgrade_5.1_to_5.2.sh +/upgrade_5.2_to_6.0.sh diff --git a/src/share/database/scripts/mysql/Makefile.am b/src/share/database/scripts/mysql/Makefile.am index cfc8134d96..eff6631399 100644 --- a/src/share/database/scripts/mysql/Makefile.am +++ b/src/share/database/scripts/mysql/Makefile.am @@ -9,7 +9,8 @@ sqlscripts_DATA += upgrade_3.0_to_4.0.sh sqlscripts_DATA += upgrade_4.0_to_4.1.sh sqlscripts_DATA += upgrade_4.1_to_5.0.sh sqlscripts_DATA += upgrade_5.0_to_5.1.sh -sqlscripts_DATA += upgrade_5.1_to_6.0.sh +sqlscripts_DATA += upgrade_5.1_to_5.2.sh +sqlscripts_DATA += upgrade_5.2_to_6.0.sh DISTCLEANFILES = upgrade_1.0_to_2.0.sh DISTCLEANFILES += upgrade_2.0_to_3.0.sh @@ -17,6 +18,7 @@ DISTCLEANFILES += upgrade_3.0_to_4.0.sh DISTCLEANFILES += upgrade_4.0_to_4.1.sh DISTCLEANFILES += upgrade_4.1_to_5.0.sh DISTCLEANFILES += upgrade_5.0_to_5.1.sh -DISTCLEANFILES += upgrade_5.1_to_6.0.sh +DISTCLEANFILES += upgrade_5.1_to_5.2.sh +DISTCLEANFILES += upgrade_5.2_to_6.0.sh EXTRA_DIST = ${sqlscripts_DATA} diff --git a/src/share/database/scripts/mysql/dhcpdb_create.mysql b/src/share/database/scripts/mysql/dhcpdb_create.mysql index b1cdd1d058..c531ac35bb 100644 --- a/src/share/database/scripts/mysql/dhcpdb_create.mysql +++ b/src/share/database/scripts/mysql/dhcpdb_create.mysql @@ -503,6 +503,16 @@ UPDATE schema_version SET version = '5', minor = '1'; # This line concludes database upgrade to version 5.1. +# Make subnet_id column types consistent with lease table columns +ALTER TABLE dhcp4_options MODIFY dhcp4_subnet_id INT UNSIGNED; +ALTER TABLE dhcp6_options MODIFY dhcp6_subnet_id INT UNSIGNED; + +# Update the schema version number +UPDATE schema_version +SET version = '5', minor = '2'; + +# This line concludes database upgrade to version 5.2. + # Add user context into table holding hosts ALTER TABLE hosts ADD COLUMN user_context TEXT NULL; diff --git a/src/share/database/scripts/mysql/upgrade_5.1_to_5.2.sh.in b/src/share/database/scripts/mysql/upgrade_5.1_to_5.2.sh.in new file mode 100644 index 0000000000..b692f69121 --- /dev/null +++ b/src/share/database/scripts/mysql/upgrade_5.1_to_5.2.sh.in @@ -0,0 +1,33 @@ +#!/bin/sh + +# 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 + +VERSION=`mysql_version "$@"` + +if [ "$VERSION" != "5.1" ]; then + printf "This script upgrades 5.1 to 5.2. Reported version is $VERSION. Skipping upgrade.\n" + exit 0 +fi + +mysql "$@" < 3.0 upgrade script was created. @@ -493,7 +495,9 @@ INSERT INTO host_identifier_type VALUES (4, 'flex-id'); UPDATE schema_version SET version = '3', minor = '1'; --- Set 3.2 schema version. +-- Schema 3.1 specification ends here. + +-- Upgrade to schema 3.2 begins here: -- Remove constraints which perform too restrictive checks on the inserted -- host reservations. We want to be able to insert host reservations which @@ -528,7 +532,24 @@ CREATE UNIQUE INDEX key_dhcp6_identifier_subnet_id ON hosts UPDATE schema_version SET version = '3', minor = '2'; --- Set 4.0 schema version. +-- Schema 3.2 specification ends here. + +-- Upgrade to schema 3.3 begins here: + +-- Change subnet ID columns type to BIGINT to match lease4/6 tables +ALTER TABLE hosts ALTER COLUMN dhcp4_subnet_id TYPE BIGINT; +ALTER TABLE hosts ALTER COLUMN dhcp6_subnet_id TYPE BIGINT; + +ALTER TABLE dhcp4_options ALTER COLUMN dhcp4_subnet_id TYPE BIGINT; +ALTER TABLE dhcp6_options ALTER COLUMN dhcp6_subnet_id TYPE BIGINT; + +-- Set 3.3 schema version. +UPDATE schema_version + SET version = '3', minor = '3'; + +-- Schema 3.3 specification ends here. + +-- Upgrade to schema 4.0 begins here: -- Add a column holding hosts for user context. ALTER TABLE hosts ADD COLUMN user_context TEXT; @@ -547,6 +568,8 @@ CREATE INDEX lease6_by_subnet_id_lease_type ON lease6 (subnet_id, lease_type); UPDATE schema_version SET version = '4', minor = '0'; +-- Schema 4.0 specification ends here. + -- Commit the script transaction. COMMIT; diff --git a/src/share/database/scripts/pgsql/upgrade_3.2_to_3.3.sh.in b/src/share/database/scripts/pgsql/upgrade_3.2_to_3.3.sh.in new file mode 100644 index 0000000000..b8c7248016 --- /dev/null +++ b/src/share/database/scripts/pgsql/upgrade_3.2_to_3.3.sh.in @@ -0,0 +1,40 @@ +#!/bin/sh + +# 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 + +VERSION=`pgsql_version "$@"` + +if [ "$VERSION" != "3.2" ]; then + printf "This script upgrades 3.2 to 3.3. Reported version is $VERSION. Skipping upgrade.\n" + exit 0 +fi + +psql "$@" >/dev/null <