self._delete_vr_id_allocation(
context, ha_network, router_db.extra_attributes.ha_vr_id)
self._delete_ha_interfaces(context, router_db.id)
- try:
+
+ # In case that create HA router failed because of the failure
+ # in HA network creation. So here put this deleting HA network
+ # procedure under 'if ha_network' block.
if not self._ha_routers_present(context,
router_db.tenant_id):
- self._delete_ha_network(context, ha_network)
- LOG.info(_LI("HA network %(network)s was deleted as "
- "no HA routers are present in tenant "
- "%(tenant)s."),
- {'network': ha_network.network_id,
- 'tenant': router_db.tenant_id})
- except n_exc.NetworkNotFound:
- LOG.debug("HA network %s was already deleted.",
- ha_network.network_id)
- except sa.exc.InvalidRequestError:
- LOG.info(_LI("HA network %s can not be deleted."),
- ha_network.network_id)
+ try:
+ self._delete_ha_network(context, ha_network)
+ except (n_exc.NetworkNotFound,
+ orm.exc.ObjectDeletedError):
+ LOG.debug(
+ "HA network for tenant %s was already deleted.",
+ router_db.tenant_id)
+ except sa.exc.InvalidRequestError:
+ LOG.info(_LI("HA network %s can not be deleted."),
+ ha_network.network_id)
+ except n_exc.NetworkInUse:
+ LOG.debug("HA network %s is still in use.",
+ ha_network.network_id)
+ else:
+ LOG.info(_LI("HA network %(network)s was deleted as "
+ "no HA routers are present in tenant "
+ "%(tenant)s."),
+ {'network': ha_network.network_id,
+ 'tenant': router_db.tenant_id})
def _unbind_ha_router(self, context, router_id):
for agent in self.get_l3_agents_hosting_routers(context, [router_id]):
from oslo_config import cfg
from oslo_utils import uuidutils
import sqlalchemy as sa
+from sqlalchemy import orm
from neutron.api.rpc.handlers import l3_rpc
from neutron.api.v2 import attributes
self.assertNotIn('HA network tenant %s' % router1['tenant_id'],
nets_after)
- def test_ha_network_is_not_deleted_if_another_ha_router_is_created(self):
- # If another router was created during deletion of current router,
- # _delete_ha_network will fail with InvalidRequestError. Check that HA
- # network won't be deleted.
+ def _test_ha_network_is_not_deleted_raise_exception(self, exception):
router1 = self._create_router()
nets_before = [net['name'] for net in
self.core_plugin.get_networks(self.admin_ctx)]
self.assertIn('HA network tenant %s' % router1['tenant_id'],
nets_before)
with mock.patch.object(self.plugin, '_delete_ha_network',
- side_effect=sa.exc.InvalidRequestError):
+ side_effect=exception):
self.plugin.delete_router(self.admin_ctx, router1['id'])
nets_after = [net['name'] for net in
self.core_plugin.get_networks(self.admin_ctx)]
self.assertIn('HA network tenant %s' % router1['tenant_id'],
nets_after)
+ def test_ha_network_is_not_deleted_if_another_ha_router_is_created(self):
+ # If another router was created during deletion of current router,
+ # _delete_ha_network will fail with InvalidRequestError. Check that HA
+ # network won't be deleted.
+ self._test_ha_network_is_not_deleted_raise_exception(
+ sa.exc.InvalidRequestError)
+
+ def test_ha_network_is_not_deleted_if_network_in_use(self):
+ self._test_ha_network_is_not_deleted_raise_exception(
+ n_exc.NetworkInUse(net_id="foo_net_id"))
+
+ def test_ha_network_is_not_deleted_if_db_deleted_error(self):
+ self._test_ha_network_is_not_deleted_raise_exception(
+ orm.exc.ObjectDeletedError(None))
+
+ def test_ha_router_create_failed_no_ha_network_delete(self):
+ tenant_id = "foo_tenant_id"
+ nets_before = self.core_plugin.get_networks(self.admin_ctx)
+ self.assertNotIn('HA network tenant %s' % tenant_id,
+ nets_before)
+
+ # Unable to create HA network
+ with mock.patch.object(self.core_plugin, 'create_network',
+ side_effect=n_exc.NoNetworkAvailable):
+ self.assertRaises(n_exc.NoNetworkAvailable,
+ self._create_router,
+ True,
+ tenant_id)
+ nets_after = self.core_plugin.get_networks(self.admin_ctx)
+ self.assertEqual(nets_before, nets_after)
+ self.assertNotIn('HA network tenant %s' % tenant_id,
+ nets_after)
+
class L3HAModeDbTestCase(L3HATestFramework):