]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#845] New version of MySQL CB queries which update DHCP options.
authorMarcin Siodelski <marcin@isc.org>
Tue, 20 Aug 2019 05:52:41 +0000 (07:52 +0200)
committerMarcin Siodelski <marcin@isc.org>
Tue, 20 Aug 2019 11:56:08 +0000 (07:56 -0400)
The updated queries support subnet, shared network and pool level options
unassigned to servers.

src/hooks/dhcp/mysql_cb/mysql_query_macros_dhcp.h
src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc
src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp6_unittest.cc

index 9670890ede7ad7e44e67646bea6fd735fc1be49f..6ae77e3c0e86f3faae456ca633baaf1a7d272183 100644 (file)
@@ -666,12 +666,9 @@ namespace {
 #endif
 
 #ifndef MYSQL_UPDATE_OPTION_COMMON
-#define MYSQL_UPDATE_OPTION_COMMON(table_prefix, pd_pool_id, ...) \
+#define MYSQL_UPDATE_OPTION_COMMON(table_prefix, server_join, pd_pool_id, ...) \
     "UPDATE " #table_prefix "_options AS o " \
-    "INNER JOIN " #table_prefix "_options_server AS a" \
-    "  ON o.option_id = a.option_id " \
-    "INNER JOIN " #table_prefix "_server AS s" \
-    "  ON a.server_id = s.id " \
+    server_join \
     "SET" \
     "  o.code = ?," \
     "  o.value = ?," \
@@ -689,16 +686,26 @@ namespace {
     "WHERE " #__VA_ARGS__
 
 #define MYSQL_UPDATE_OPTION4_WITH_TAG(...) \
-    MYSQL_UPDATE_OPTION_COMMON(dhcp4, "", s.tag = ? __VA_ARGS__)
+    MYSQL_UPDATE_OPTION_COMMON(dhcp4, \
+    "INNER JOIN dhcp4_options_server AS a" \
+    "  ON o.option_id = a.option_id " \
+    "INNER JOIN dhcp4_server AS s" \
+    "  ON a.server_id = s.id ", \
+    "", s.tag = ? __VA_ARGS__)
 
 #define MYSQL_UPDATE_OPTION4_NO_TAG(...) \
-    MYSQL_UPDATE_OPTION_COMMON(dhcp4, "", __VA_ARGS__)
+    MYSQL_UPDATE_OPTION_COMMON(dhcp4, "", "", __VA_ARGS__)
 
 #define MYSQL_UPDATE_OPTION6_WITH_TAG(...) \
-    MYSQL_UPDATE_OPTION_COMMON(dhcp6, ", o.pd_pool_id = ? ", s.tag = ? __VA_ARGS__)
+    MYSQL_UPDATE_OPTION_COMMON(dhcp6, \
+    "INNER JOIN dhcp6_options_server AS a" \
+    "  ON o.option_id = a.option_id " \
+    "INNER JOIN dhcp6_server AS s" \
+    "  ON a.server_id = s.id ", \
+    ", o.pd_pool_id = ? ", s.tag = ? __VA_ARGS__)
 
 #define MYSQL_UPDATE_OPTION6_NO_TAG(...) \
-    MYSQL_UPDATE_OPTION_COMMON(dhcp6, ", o.pd_pool_id = ? ", __VA_ARGS__)
+    MYSQL_UPDATE_OPTION_COMMON(dhcp6, "", ", o.pd_pool_id = ? ", __VA_ARGS__)
 #endif
 
 #ifndef MYSQL_UPDATE_SERVER
@@ -824,20 +831,20 @@ namespace {
     "WHERE a.option_def_id IS NULL " #__VA_ARGS__
 #endif
 
-#ifndef MYSQL_DELETE_OPTION
-#define MYSQL_DELETE_OPTION_COMMON(table_prefix, ...) \
+#ifndef MYSQL_DELETE_OPTION_WITH_TAG
+#define MYSQL_DELETE_OPTION_WITH_TAG(table_prefix, ...) \
     "DELETE o FROM " #table_prefix "_options AS o " \
     "INNER JOIN " #table_prefix "_options_server AS a" \
     "  ON o.option_id = a.option_id " \
     "INNER JOIN " #table_prefix "_server AS s" \
     "  ON a.server_id = s.id " \
-    #__VA_ARGS__
-
-#define MYSQL_DELETE_OPTION_WITH_TAG(table_prefix, ...) \
-    MYSQL_DELETE_OPTION_COMMON(table_prefix, WHERE s.tag = ? __VA_ARGS__)
+    "WHERE s.tag = ? " #__VA_ARGS__
+#endif
 
+#ifndef MYSQL_DELETE_OPTION_NO_TAG
 #define MYSQL_DELETE_OPTION_NO_TAG(table_prefix, ...) \
-    MYSQL_DELETE_OPTION_COMMON(table_prefix, __VA_ARGS__)
+    "DELETE o FROM " #table_prefix "_options AS o " \
+    #__VA_ARGS__
 #endif
 
 #ifndef MYSQL_DELETE_OPTION_UNASSIGNED
index ff1c059fcc0db98e68aba2602adb63d751433f8c..1f974a363c390509f4ee1e40db599c786162391f 100644 (file)
@@ -3624,8 +3624,11 @@ TEST_F(MySqlConfigBackendDHCPv4Test, createUpdateDeleteSubnetOption4) {
                           "subnet set");
     }
 
+    // The inserted subnet contains two options.
+    ASSERT_EQ(2, countRows("dhcp4_options"));
+
     OptionDescriptorPtr opt_boot_file_name = test_options_[0];
-    cbptr_->createUpdateOption4(ServerSelector::ALL(), subnet->getID(),
+    cbptr_->createUpdateOption4(ServerSelector::ANY(), subnet->getID(),
                                 opt_boot_file_name);
 
     returned_subnet = cbptr_->getSubnet4(ServerSelector::ALL(),
@@ -3653,11 +3656,15 @@ TEST_F(MySqlConfigBackendDHCPv4Test, createUpdateDeleteSubnetOption4) {
                           "subnet specific option set");
     }
 
+    // We have added one option to the existing subnet. We should now have
+    // three options.
+    ASSERT_EQ(3, countRows("dhcp4_options"));
+
     opt_boot_file_name->persistent_ = !opt_boot_file_name->persistent_;
     cbptr_->createUpdateOption4(ServerSelector::ALL(), subnet->getID(),
                                 opt_boot_file_name);
 
-    returned_subnet = cbptr_->getSubnet4(ServerSelector::ALL(),
+    returned_subnet = cbptr_->getSubnet4(ServerSelector::ANY(),
                                          subnet->getID());
     ASSERT_TRUE(returned_subnet);
     returned_opt_boot_file_name =
@@ -3676,6 +3683,10 @@ TEST_F(MySqlConfigBackendDHCPv4Test, createUpdateDeleteSubnetOption4) {
                           "subnet specific option set");
     }
 
+    // Updating the option should replace the existing instance with the new
+    // instance. Therefore, we should still have three options.
+    ASSERT_EQ(3, countRows("dhcp4_options"));
+
     // It should succeed for any server.
     EXPECT_EQ(1, cbptr_->deleteOption4(ServerSelector::ANY(), subnet->getID(),
                                        opt_boot_file_name->option_->getType(),
@@ -3693,6 +3704,9 @@ TEST_F(MySqlConfigBackendDHCPv4Test, createUpdateDeleteSubnetOption4) {
                           AuditEntry::ModificationType::UPDATE,
                           "subnet specific option deleted");
     }
+
+    // We should have only two options after deleting one of them.
+    ASSERT_EQ(2, countRows("dhcp4_options"));
 }
 
 // This test verifies that option can be inserted, updated and deleted
@@ -3709,6 +3723,9 @@ TEST_F(MySqlConfigBackendDHCPv4Test, createUpdateDeletePoolOption4) {
                           "subnet set");
     }
 
+    // Inserted subnet has two options.
+    ASSERT_EQ(2, countRows("dhcp4_options"));
+
     // Add an option into the pool.
     const PoolPtr pool = subnet->getPool(Lease::TYPE_V4, IOAddress("192.0.2.10"));
     ASSERT_TRUE(pool);
@@ -3747,6 +3764,8 @@ TEST_F(MySqlConfigBackendDHCPv4Test, createUpdateDeletePoolOption4) {
                           "pool specific option set");
     }
 
+    // With the newly inserted option we should now have three options.
+    ASSERT_EQ(3, countRows("dhcp4_options"));
 
     // Modify the option and update it in the database.
     opt_boot_file_name->persistent_ = !opt_boot_file_name->persistent_;
@@ -3781,6 +3800,10 @@ TEST_F(MySqlConfigBackendDHCPv4Test, createUpdateDeletePoolOption4) {
                           "pool specific option set");
     }
 
+    // The new option instance should replace the existing one, so we should
+    // still have three options.
+    ASSERT_EQ(3, countRows("dhcp4_options"));
+
     // Delete option for any server should succeed.
     EXPECT_EQ(1, cbptr_->deleteOption4(ServerSelector::ANY(),
                                        pool->getFirstAddress(),
@@ -3808,6 +3831,10 @@ TEST_F(MySqlConfigBackendDHCPv4Test, createUpdateDeletePoolOption4) {
                           AuditEntry::ModificationType::UPDATE,
                           "pool specific option deleted");
     }
+
+    // The option has been deleted so the number of options should now
+    // be down to 2.
+    EXPECT_EQ(2, countRows("dhcp4_options"));
 }
 
 // This test verifies that shared network level option can be added,
@@ -3831,6 +3858,9 @@ TEST_F(MySqlConfigBackendDHCPv4Test, createUpdateDeleteSharedNetworkOption4) {
                           "shared network set");
     }
 
+    // The inserted shared network has no options.
+    ASSERT_EQ(0, countRows("dhcp4_options"));
+
     OptionDescriptorPtr opt_boot_file_name = test_options_[0];
     cbptr_->createUpdateOption4(ServerSelector::ALL(),
                                 shared_network->getName(),
@@ -3861,6 +3891,9 @@ TEST_F(MySqlConfigBackendDHCPv4Test, createUpdateDeleteSharedNetworkOption4) {
                           "shared network specific option set");
     }
 
+    // One option should now be stored in the database.
+    ASSERT_EQ(1, countRows("dhcp4_options"));
+
     opt_boot_file_name->persistent_ = !opt_boot_file_name->persistent_;
     cbptr_->createUpdateOption4(ServerSelector::ALL(),
                                 shared_network->getName(),
@@ -3885,6 +3918,10 @@ TEST_F(MySqlConfigBackendDHCPv4Test, createUpdateDeleteSharedNetworkOption4) {
                           "shared network specific option set");
     }
 
+    // The new option instance should replace the existing option instance,
+    // so we should still have one option.
+    ASSERT_EQ(1, countRows("dhcp4_options"));
+
     // Deleting an option for any server should succeed.
     EXPECT_EQ(1, cbptr_->deleteOption4(ServerSelector::ANY(),
                                        shared_network->getName(),
@@ -3901,6 +3938,9 @@ TEST_F(MySqlConfigBackendDHCPv4Test, createUpdateDeleteSharedNetworkOption4) {
                           AuditEntry::ModificationType::UPDATE,
                           "shared network specific option deleted");
     }
+
+    // After deleting the option we should be back to 0.
+    EXPECT_EQ(0, countRows("dhcp4_options"));
 }
 
 
index b513b89ead4761552b5908d474210509ec23614b..0e9af6451683be03dc4a1f97f5be2db24dca9d9d 100644 (file)
@@ -3665,6 +3665,9 @@ TEST_F(MySqlConfigBackendDHCPv6Test, createUpdateDeleteSubnetOption6) {
                           "subnet set");
     }
 
+    // The inserted subnet contains four options.
+    ASSERT_EQ(4, countRows("dhcp6_options"));
+
     OptionDescriptorPtr opt_posix_timezone = test_options_[0];
     cbptr_->createUpdateOption6(ServerSelector::ALL(), subnet->getID(),
                                 opt_posix_timezone);
@@ -3694,6 +3697,10 @@ TEST_F(MySqlConfigBackendDHCPv6Test, createUpdateDeleteSubnetOption6) {
                           "subnet specific option set");
     }
 
+    // We have added one option to the existing subnet. We should now have
+    // five options.
+    ASSERT_EQ(5, countRows("dhcp6_options"));
+
     opt_posix_timezone->persistent_ = !opt_posix_timezone->persistent_;
     cbptr_->createUpdateOption6(ServerSelector::ALL(), subnet->getID(),
                                 opt_posix_timezone);
@@ -3717,6 +3724,10 @@ TEST_F(MySqlConfigBackendDHCPv6Test, createUpdateDeleteSubnetOption6) {
                           "subnet specific option set");
     }
 
+    // Updating the option should replace the existing instance with the new
+    // instance. Therefore, we should still have five options.
+    ASSERT_EQ(5, countRows("dhcp6_options"));
+
     // It should succeed for any server.
     EXPECT_EQ(1, cbptr_->deleteOption6(ServerSelector::ANY(), subnet->getID(),
                                        opt_posix_timezone->option_->getType(),
@@ -3734,6 +3745,9 @@ TEST_F(MySqlConfigBackendDHCPv6Test, createUpdateDeleteSubnetOption6) {
                           AuditEntry::ModificationType::UPDATE,
                           "subnet specific option deleted");
     }
+
+    // We should have only four options after deleting one of them.
+    ASSERT_EQ(4, countRows("dhcp6_options"));
 }
 
 // This test verifies that option can be inserted, updated and deleted
@@ -3750,6 +3764,9 @@ TEST_F(MySqlConfigBackendDHCPv6Test, createUpdateDeletePoolOption6) {
                           "subnet set");
     }
 
+    // Inserted subnet has four options.
+    ASSERT_EQ(4, countRows("dhcp6_options"));
+
     // Add an option into the pool.
     const PoolPtr pool = subnet->getPool(Lease::TYPE_NA,
                                          IOAddress("2001:db8::10"));
@@ -3789,6 +3806,8 @@ TEST_F(MySqlConfigBackendDHCPv6Test, createUpdateDeletePoolOption6) {
                           "address pool specific option set");
     }
 
+    // With the newly inserted option we should now have five options.
+    ASSERT_EQ(5, countRows("dhcp6_options"));
 
     // Modify the option and update it in the database.
     opt_posix_timezone->persistent_ = !opt_posix_timezone->persistent_;
@@ -3823,6 +3842,10 @@ TEST_F(MySqlConfigBackendDHCPv6Test, createUpdateDeletePoolOption6) {
                           "address pool specific option set");
     }
 
+    // The new option instance should replace the existing one, so we should
+    // still have five options.
+    ASSERT_EQ(5, countRows("dhcp6_options"));
+
     // Delete option for any server should succeed.
     EXPECT_EQ(1, cbptr_->deleteOption6(ServerSelector::ANY(),
                                        pool->getFirstAddress(),
@@ -3850,6 +3873,10 @@ TEST_F(MySqlConfigBackendDHCPv6Test, createUpdateDeletePoolOption6) {
                           AuditEntry::ModificationType::UPDATE,
                           "address pool specific option deleted");
     }
+
+    // The option has been deleted so the number of options should now
+    // be down to 4.
+    EXPECT_EQ(4, countRows("dhcp6_options"));
 }
 
 // This test verifies that option can be inserted, updated and deleted
@@ -3866,6 +3893,9 @@ TEST_F(MySqlConfigBackendDHCPv6Test, createUpdateDeletePdPoolOption6) {
                           "subnet set");
     }
 
+    // Inserted subnet has four options.
+    ASSERT_EQ(4, countRows("dhcp6_options"));
+
     // Add an option into the pd pool.
     const PoolPtr pd_pool = subnet->getPool(Lease::TYPE_PD,
                                             IOAddress("2001:db8:a:10::"));
@@ -3908,6 +3938,8 @@ TEST_F(MySqlConfigBackendDHCPv6Test, createUpdateDeletePdPoolOption6) {
                           "prefix delegation pool specific option set");
     }
 
+    // With the newly inserted option we should now have five options.
+    ASSERT_EQ(5, countRows("dhcp6_options"));
 
     // Modify the option and update it in the database.
     opt_posix_timezone->persistent_ = !opt_posix_timezone->persistent_;
@@ -3943,6 +3975,10 @@ TEST_F(MySqlConfigBackendDHCPv6Test, createUpdateDeletePdPoolOption6) {
                           "prefix delegation pool specific option set");
     }
 
+    // The new option instance should replace the existing one, so we should
+    // still have five options.
+    ASSERT_EQ(5, countRows("dhcp6_options"));
+
     // Delete option for any server should succeed.
     EXPECT_EQ(1, cbptr_->deleteOption6(ServerSelector::ANY(),
                                        pd_pool->getFirstAddress(),
@@ -3970,6 +4006,10 @@ TEST_F(MySqlConfigBackendDHCPv6Test, createUpdateDeletePdPoolOption6) {
                           AuditEntry::ModificationType::UPDATE,
                           "prefix delegation pool specific option deleted");
     }
+
+    // The option has been deleted so the number of options should now
+    // be down to 4.
+    EXPECT_EQ(4, countRows("dhcp6_options"));
 }
 
 // This test verifies that shared network level option can be added,
@@ -3993,6 +4033,9 @@ TEST_F(MySqlConfigBackendDHCPv6Test, createUpdateDeleteSharedNetworkOption6) {
                           "shared network set");
     }
 
+    // The inserted shared network has no options.
+    ASSERT_EQ(0, countRows("dhcp6_options"));
+
     OptionDescriptorPtr opt_posix_timezone = test_options_[0];
     cbptr_->createUpdateOption6(ServerSelector::ALL(),
                                 shared_network->getName(),
@@ -4023,6 +4066,9 @@ TEST_F(MySqlConfigBackendDHCPv6Test, createUpdateDeleteSharedNetworkOption6) {
                           "shared network specific option set");
     }
 
+    // One option should now be stored in the database.
+    ASSERT_EQ(1, countRows("dhcp6_options"));
+
     opt_posix_timezone->persistent_ = !opt_posix_timezone->persistent_;
     cbptr_->createUpdateOption6(ServerSelector::ALL(),
                                 shared_network->getName(),
@@ -4047,6 +4093,10 @@ TEST_F(MySqlConfigBackendDHCPv6Test, createUpdateDeleteSharedNetworkOption6) {
                           "shared network specific option set");
     }
 
+    // The new option instance should replace the existing option instance,
+    // so we should still have one option.
+    ASSERT_EQ(1, countRows("dhcp6_options"));
+
     // Deleting an option for any server should succeed.
     EXPECT_EQ(1, cbptr_->deleteOption6(ServerSelector::ANY(),
                                        shared_network->getName(),
@@ -4063,6 +4113,9 @@ TEST_F(MySqlConfigBackendDHCPv6Test, createUpdateDeleteSharedNetworkOption6) {
                           AuditEntry::ModificationType::UPDATE,
                           "shared network specific option deleted");
     }
+
+    // After deleting the option we should be back to 0.
+    EXPECT_EQ(0, countRows("dhcp6_options"));
 }
 
 }