]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#429,!217] Extended dhcpX_global_parameter: added parameter_type.
authorMarcin Siodelski <marcin@isc.org>
Wed, 30 Jan 2019 21:01:24 +0000 (22:01 +0100)
committerMarcin Siodelski <marcin@isc.org>
Thu, 31 Jan 2019 17:07:35 +0000 (18:07 +0100)
src/bin/admin/tests/mysql_tests.sh.in
src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.cc
src/hooks/dhcp/mysql_cb/mysql_query_macros_dhcp.h
src/share/database/scripts/mysql/dhcpdb_create.mysql
src/share/database/scripts/mysql/dhcpdb_drop.mysql
src/share/database/scripts/mysql/upgrade_7.0_to_8.0.sh.in

index 06357b65f58f5ff995e018c13ac0ad5e12c4e47d..bacb3522bd4ae27d31673f2245c835a6307714a8 100644 (file)
@@ -258,7 +258,7 @@ mysql_upgrade_test() {
 
     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 7.0
+    # Ok, we have a 1.0 database. Let's upgrade it to 8.0
     ${keaadmin} lease-upgrade mysql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir
     ERRCODE=$?
 
@@ -491,7 +491,7 @@ EOF
     run_statement "dhcp4_audit" "$qry"
 
     # table: dhcp4_global_parameter
-    qry="select id, name, value, modification_ts from dhcp4_global_parameter"
+    qry="select id, name, value, parameter_type, modification_ts from dhcp4_global_parameter"
     run_statement "dhcp4_global_parameter" "$qry"
 
     # table: dhcp4_global_parameter_server
@@ -547,7 +547,7 @@ EOF
     run_statement "dhcp6_audit" "$qry"
 
     # table: dhcp6_global_parameter
-    qry="select id, name, value, modification_ts from dhcp6_global_parameter"
+    qry="select id, name, value, parameter_type, modification_ts from dhcp6_global_parameter"
     run_statement "dhcp6_global_parameter" "$qry"
 
     # table: dhcp6_global_parameter_server
@@ -642,6 +642,10 @@ EOF
     # New triggers aren't tested here because the extensive tests are
     # provided with the backend implementations.
 
+    # parameter_data_type must exist and must have 4 rows.
+    qry="SELECT COUNT(*) FROM parameter_data_type";
+    run_statement "parameter_data_type count" "$qry" 4;
+
     # Verify upgraded schema reports version 8.0
     version=$(${keaadmin} lease-version mysql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir)
     assert_str_eq "8.0" ${version} "Expected kea-admin to return %s, returned value was %s"
index 02bedf31efcf6e3e67f434346e0b70e7408b3a97..0b7ae95e712a741d89f42343fb464d8dac7cd778 100644 (file)
@@ -152,6 +152,7 @@ public:
             MySqlBinding::createInteger<uint64_t>(), // id
             MySqlBinding::createString(GLOBAL_PARAMETER_NAME_BUF_LENGTH), // name
             MySqlBinding::createString(GLOBAL_PARAMETER_VALUE_BUF_LENGTH), // value
+            MySqlBinding::createInteger<uint8_t>(), // parameter_type
             MySqlBinding::createTimestamp() // modification_ts
         };
 
@@ -159,9 +160,44 @@ public:
                           [&parameters]
                           (MySqlBindingCollection& out_bindings) {
             if (!out_bindings[1]->getString().empty()) {
-                StampedValuePtr stamped_value(new StampedValue(out_bindings[1]->getString(),
-                                                               out_bindings[2]->getString()));
-                stamped_value->setModificationTime(out_bindings[3]->getTimestamp());
+                std::string name = out_bindings[1]->getString();
+                std::string value = out_bindings[2]->getString();
+                uint8_t parameter_type = out_bindings[3]->getInteger<uint8_t>();
+
+                StampedValuePtr stamped_value;
+
+                try {
+                    switch (static_cast<Element::types>(parameter_type)) {
+                    case Element::string:
+                        stamped_value = StampedValue::create(name, value);
+                        break;
+
+                    case Element::integer:
+                        stamped_value = StampedValue::create(name,
+                            Element::create(boost::lexical_cast<int64_t>(value)));
+                        break;
+
+                    case Element::boolean:
+                        stamped_value = StampedValue::create(name,
+                            Element::create((value == "1") ? true : false));
+                        break;
+
+                    case Element::real:
+                        stamped_value = StampedValue::create(name,
+                            Element::create(boost::lexical_cast<double>(value)));
+                        break;
+
+                    default:
+                        isc_throw(TypeError, "invalid type of the parameter '"
+                                  << name << "' fetched from the database");
+                    }
+
+                } catch (const boost::bad_lexical_cast& ex) {
+                    isc_throw(BadValue, "actual type of the value '" << name
+                              << "' is different than marked in the database");
+                }
+
+                stamped_value->setModificationTime(out_bindings[4]->getTimestamp());
                 parameters.insert(stamped_value);
             }
         });
@@ -209,6 +245,7 @@ public:
         MySqlBindingCollection in_bindings = {
             MySqlBinding::createString(value->getName()),
             MySqlBinding::createString(value->getValue()),
+            MySqlBinding::createInteger<uint8_t>(value->getType()),
             MySqlBinding::createTimestamp(value->getModificationTime()),
             MySqlBinding::createString(tag),
             MySqlBinding::createString(value->getName())
index 7e5fa0c312d41e01be51cc7f9336e78a032391ed..f2eba3eabeb7fd844601bede1cc59ea943c178c3 100644 (file)
@@ -35,6 +35,7 @@ namespace {
     "  g.id," \
     "  g.name," \
     "  g.value," \
+    "  g.parameter_type," \
     "  g.modification_ts " \
     "FROM " #table_prefix "_global_parameter AS g " \
     "INNER JOIN " #table_prefix "_global_parameter_server AS a " \
@@ -217,8 +218,9 @@ namespace {
     "INSERT INTO " #table_prefix "_global_parameter(" \
     "  name," \
     "  value," \
+    "  parameter_type," \
     "  modification_ts" \
-    ") VALUES (?, ?, ?)"
+    ") VALUES (?, ?, ?, ?)"
 #endif
 
 #ifndef MYSQL_INSERT_GLOBAL_PARAMETER_SERVER
@@ -322,6 +324,7 @@ namespace {
     "SET" \
     "  g.name = ?," \
     "  g.value = ?," \
+    "  g.parameter_type = ?," \
     "  g.modification_ts = ? " \
     "WHERE s.tag = ? AND g.name = ?"
 #endif
index 825df9ad677584ccd6f8aed79a01d6012985d18a..3672f53c7f232c5de9e0cedd4d6f2e73eb09314b 100644 (file)
@@ -1849,6 +1849,38 @@ CREATE TRIGGER dhcp4_options_ADEL AFTER DELETE ON dhcp4_options
     END $$
 DELIMITER ;
 
+-- -----------------------------------------------------
+-- Table `parameter_data_type`
+-- Reflects an enum used by Kea to define supported
+-- data types for the simple configuration parameters,
+-- e.g. global parameters used by DHCP servers.
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS parameter_data_type (
+    id TINYINT UNSIGNED NOT NULL PRIMARY KEY,
+    name VARCHAR(32) NOT NULL
+) ENGINE = InnoDB;
+
+START TRANSACTION;
+INSERT INTO parameter_data_type VALUES (0, 'integer');
+INSERT INTO parameter_data_type VALUES (1, 'real');
+INSERT INTO parameter_data_type VALUES (2, 'boolean');
+INSERT INTO parameter_data_type VALUES (4, 'string');
+COMMIT;
+
+ALTER TABLE dhcp4_global_parameter
+    ADD COLUMN parameter_type TINYINT UNSIGNED NOT NULL;
+
+ALTER TABLE dhcp4_global_parameter
+    ADD CONSTRAINT fk_dhcp4_global_parameter_type FOREIGN KEY (parameter_type)
+        REFERENCES parameter_data_type (id);
+
+ALTER TABLE dhcp6_global_parameter
+    ADD COLUMN parameter_type TINYINT UNSIGNED NOT NULL;
+
+ALTER TABLE dhcp6_global_parameter
+    ADD CONSTRAINT fk_dhcp6_global_parameter_type FOREIGN KEY (parameter_type)
+        REFERENCES parameter_data_type (id);
+
 
 # Update the schema version number
 UPDATE schema_version
index 7fcb8734ee01c550f0351546145b15c6cde5b652..945e59dc9b8bca519179c781406cad31a451070b 100644 (file)
@@ -59,6 +59,7 @@ DROP TABLE IF EXISTS dhcp6_shared_network_server;
 DROP TABLE IF EXISTS dhcp6_subnet;
 DROP TABLE IF EXISTS dhcp6_subnet_server;
 DROP TABLE IF EXISTS modification;
+DROP TABLE IF EXISTS parameter_data_type;
 DROP PROCEDURE IF EXISTS createAuditRevisionDHCP4;
 DROP PROCEDURE IF EXISTS createAuditEntryDHCP4;
 DROP TRIGGER IF EXISTS dhcp4_global_parameter_AINS;
index 064492aa6f270073a8564f72c35bb2aebc1a2581..3bf915266f5f066e197d704646e6bb3c7d4bedf0 100644 (file)
@@ -532,6 +532,38 @@ CREATE TRIGGER dhcp4_options_ADEL AFTER DELETE ON dhcp4_options
     END $$
 DELIMITER ;
 
+-- -----------------------------------------------------
+-- Table parameter_data_type
+-- Reflects an enum used by Kea to define supported
+-- data types for the simple configuration parameters,
+-- e.g. global parameters used by DHCP servers.
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS parameter_data_type (
+    id TINYINT UNSIGNED NOT NULL PRIMARY KEY,
+    name VARCHAR(32) NOT NULL
+) ENGINE = InnoDB;
+
+START TRANSACTION;
+INSERT INTO parameter_data_type VALUES (0, 'integer');
+INSERT INTO parameter_data_type VALUES (1, 'real');
+INSERT INTO parameter_data_type VALUES (2, 'boolean');
+INSERT INTO parameter_data_type VALUES (4, 'string');
+COMMIT;
+
+ALTER TABLE dhcp4_global_parameter
+    ADD COLUMN parameter_type TINYINT UNSIGNED NOT NULL;
+
+ALTER TABLE dhcp4_global_parameter
+    ADD CONSTRAINT fk_dhcp4_global_parameter_type FOREIGN KEY (parameter_type)
+        REFERENCES parameter_data_type (id);
+
+ALTER TABLE dhcp6_global_parameter
+    ADD COLUMN parameter_type TINYINT UNSIGNED NOT NULL;
+
+ALTER TABLE dhcp6_global_parameter
+    ADD CONSTRAINT fk_dhcp6_global_parameter_type FOREIGN KEY (parameter_type)
+        REFERENCES parameter_data_type (id);
+
 
 # Update the schema version number
 UPDATE schema_version