From d16a20bae693ef3943b105509609b2c0a11aea8b Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Mon, 22 Jul 2019 14:15:33 +0200 Subject: [PATCH] [#680,!426] Delete embedded shared network options when network is deleted. --- .../mysql_cb/tests/mysql_cb_dhcp4_unittest.cc | 23 ++++++ .../mysql_cb/tests/mysql_cb_dhcp6_unittest.cc | 23 ++++++ .../scripts/mysql/dhcpdb_create.mysql | 72 +++++++++++++------ 3 files changed, 95 insertions(+), 23 deletions(-) diff --git a/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc b/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc index bd4de446da..ac9a5304ad 100644 --- a/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc +++ b/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc @@ -2754,6 +2754,29 @@ TEST_F(MySqlConfigBackendDHCPv4Test, sharedNetworkLifetime) { returned_network->toElement()->str()); } +// Test that deleting a shared network triggers deletion of the options +// associated with the shared network. +TEST_F(MySqlConfigBackendDHCPv4Test, sharedNetworkOptions) { + EXPECT_NO_THROW(cbptr_->createUpdateSharedNetwork4(ServerSelector::ALL(), test_networks_[0])); + EXPECT_EQ(3, countRows("dhcp4_options")); + + EXPECT_NO_THROW(cbptr_->createUpdateSharedNetwork4(ServerSelector::ALL(), test_networks_[1])); + EXPECT_EQ(0, countRows("dhcp4_options")); + + EXPECT_NO_THROW(cbptr_->deleteSharedNetwork4(ServerSelector::ALL(), + test_networks_[1]->getName())); + EXPECT_EQ(0, countRows("dhcp4_shared_network")); + EXPECT_EQ(0, countRows("dhcp4_options")); + + EXPECT_NO_THROW(cbptr_->createUpdateSharedNetwork4(ServerSelector::ALL(), test_networks_[0])); + EXPECT_EQ(3, countRows("dhcp4_options")); + + EXPECT_NO_THROW(cbptr_->deleteSharedNetwork4(ServerSelector::ALL(), + test_networks_[0]->getName())); + EXPECT_EQ(0, countRows("dhcp4_shared_network")); + EXPECT_EQ(0, countRows("dhcp4_options")); +} + // Test that option definition can be inserted, fetched, updated and then // fetched again. TEST_F(MySqlConfigBackendDHCPv4Test, getOptionDef4) { diff --git a/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp6_unittest.cc b/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp6_unittest.cc index 9a0e26c246..c0aedf423d 100644 --- a/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp6_unittest.cc +++ b/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp6_unittest.cc @@ -2772,6 +2772,29 @@ TEST_F(MySqlConfigBackendDHCPv6Test, sharedNetworkLifetime) { returned_network->toElement()->str()); } +// Test that deleting a shared network triggers deletion of the options +// associated with the shared network. +TEST_F(MySqlConfigBackendDHCPv6Test, sharedNetworkOptions) { + EXPECT_NO_THROW(cbptr_->createUpdateSharedNetwork6(ServerSelector::ALL(), test_networks_[0])); + EXPECT_EQ(3, countRows("dhcp6_options")); + + EXPECT_NO_THROW(cbptr_->createUpdateSharedNetwork6(ServerSelector::ALL(), test_networks_[1])); + EXPECT_EQ(0, countRows("dhcp6_options")); + + EXPECT_NO_THROW(cbptr_->deleteSharedNetwork6(ServerSelector::ALL(), + test_networks_[1]->getName())); + EXPECT_EQ(0, countRows("dhcp6_shared_network")); + EXPECT_EQ(0, countRows("dhcp6_options")); + + EXPECT_NO_THROW(cbptr_->createUpdateSharedNetwork6(ServerSelector::ALL(), test_networks_[0])); + EXPECT_EQ(3, countRows("dhcp6_options")); + + EXPECT_NO_THROW(cbptr_->deleteSharedNetwork6(ServerSelector::ALL(), + test_networks_[0]->getName())); + EXPECT_EQ(0, countRows("dhcp6_shared_network")); + EXPECT_EQ(0, countRows("dhcp6_options")); +} + // Test that option definition can be inserted, fetched, updated and then // fetched again. TEST_F(MySqlConfigBackendDHCPv6Test, getOptionDef6) { diff --git a/src/share/database/scripts/mysql/dhcpdb_create.mysql b/src/share/database/scripts/mysql/dhcpdb_create.mysql index 599fdbd378..7fae77ac53 100644 --- a/src/share/database/scripts/mysql/dhcpdb_create.mysql +++ b/src/share/database/scripts/mysql/dhcpdb_create.mysql @@ -2377,6 +2377,35 @@ SET version = '8', minor = '1'; # This line concludes database upgrade to version 8.1. +# Drop existing trigger on the dhcp4_shared_network table. +DROP TRIGGER dhcp4_shared_network_ADEL; + +# Create new trigger which will delete options associated with the shared +# network. +DELIMITER $$ +CREATE TRIGGER dhcp4_shared_network_BDEL BEFORE DELETE ON dhcp4_shared_network + FOR EACH ROW + BEGIN + CALL createAuditEntryDHCP4('dhcp4_shared_network', OLD.id, "delete"); + DELETE FROM dhcp4_options WHERE shared_network_name = OLD.name; + END $$ +DELIMITER ; + +# Drop existing trigger on the dhcp4_subnet table. +DROP TRIGGER dhcp4_subnet_ADEL; + +# Create new trigger which will delete pools associated with the subnet and +# the options associated with the subnet. +DELIMITER $$ +CREATE TRIGGER dhcp4_subnet_BDEL BEFORE DELETE ON dhcp4_subnet + FOR EACH ROW + BEGIN + CALL createAuditEntryDHCP4('dhcp4_subnet', OLD.subnet_id, "delete"); + DELETE FROM dhcp4_pool WHERE subnet_id = OLD.subnet_id; + DELETE FROM dhcp4_options WHERE dhcp4_subnet_id = OLD.subnet_id; + END $$ +DELIMITER ; + # Do not perform cascade deletion of the data in the dhcp4_pool because # the cascade deletion does not execute triggers associated with the table. # Instead we are going to use triggers on the dhcp4_subnet table. @@ -2388,19 +2417,33 @@ ALTER TABLE dhcp4_pool REFERENCES dhcp4_subnet (subnet_id) ON DELETE NO ACTION ON UPDATE CASCADE; +# Drop existing trigger on the dhcp6_shared_network table. +DROP TRIGGER dhcp6_shared_network_ADEL; -# Drop existing trigger on the dhcp4_subnet table. -DROP TRIGGER dhcp4_subnet_ADEL; +# Create new trigger which will delete options associated with the shared +# network. +DELIMITER $$ +CREATE TRIGGER dhcp6_shared_network_BDEL BEFORE DELETE ON dhcp6_shared_network + FOR EACH ROW + BEGIN + CALL createAuditEntryDHCP6('dhcp6_shared_network', OLD.id, "delete"); + DELETE FROM dhcp6_options WHERE shared_network_name = OLD.name; + END $$ +DELIMITER ; + +# Drop existing trigger on the dhcp6_subnet table. +DROP TRIGGER dhcp6_subnet_ADEL; # Create new trigger which will delete pools associated with the subnet and # the options associated with the subnet. DELIMITER $$ -CREATE TRIGGER dhcp4_subnet_BDEL BEFORE DELETE ON dhcp4_subnet +CREATE TRIGGER dhcp6_subnet_BDEL BEFORE DELETE ON dhcp6_subnet FOR EACH ROW BEGIN - CALL createAuditEntryDHCP4('dhcp4_subnet', OLD.subnet_id, "delete"); - DELETE FROM dhcp4_pool WHERE subnet_id = OLD.subnet_id; - DELETE FROM dhcp4_options WHERE dhcp4_subnet_id = OLD.subnet_id; + CALL createAuditEntryDHCP6('dhcp6_subnet', OLD.subnet_id, "delete"); + DELETE FROM dhcp6_pool WHERE subnet_id = OLD.subnet_id; + DELETE FROM dhcp6_pd_pool WHERE subnet_id = OLD.subnet_id; + DELETE FROM dhcp6_options WHERE dhcp6_subnet_id = OLD.subnet_id; END $$ DELIMITER ; @@ -2433,23 +2476,6 @@ END $$ DELIMITER ; -# Drop existing trigger on the dhcp6_subnet table. -DROP TRIGGER dhcp6_subnet_ADEL; - -# Create new trigger which will delete pools associated with the subnet and -# the options associated with the subnet. -DELIMITER $$ -CREATE TRIGGER dhcp6_subnet_BDEL BEFORE DELETE ON dhcp6_subnet - FOR EACH ROW - BEGIN - CALL createAuditEntryDHCP6('dhcp6_subnet', OLD.subnet_id, "delete"); - DELETE FROM dhcp6_pool WHERE subnet_id = OLD.subnet_id; - DELETE FROM dhcp6_pd_pool WHERE subnet_id = OLD.subnet_id; - DELETE FROM dhcp6_options WHERE dhcp6_subnet_id = OLD.subnet_id; - END $$ -DELIMITER ; - - # Update the schema version number UPDATE schema_version SET version = '8', minor = '2'; -- 2.47.2