Fix-DVR Gateway clear doesn't delete csnat port
When a gateway is set to a distributed router, the router checks for the interfaces associated with the router and based on the number of interfaces the router creates "csnat" interface ports that would be used by the SNAT service in the Service Node. When a gateway is cleared, the plugin should delete the "csnat" interface ports. In the current code, it is deleting the port and re-creating the port with a different id. A check need to be made before it creates a new port to make sure that the router has a valid gateway port. This is a bug and this patch fixes this issue. Change-Id: I84f1795360b3693a025b5fa3454bf9efc7e503ae Closes-Bug: #1350089
This commit is contained in:
parent
009725f9b3
commit
d2a4aa0927
@ -116,7 +116,7 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin,
|
|||||||
super(L3_NAT_with_dvr_db_mixin,
|
super(L3_NAT_with_dvr_db_mixin,
|
||||||
self)._create_gw_port(context, router_id,
|
self)._create_gw_port(context, router_id,
|
||||||
router, new_network)
|
router, new_network)
|
||||||
if router.extra_attributes.distributed:
|
if router.extra_attributes.distributed and router.gw_port:
|
||||||
snat_p_list = self.create_snat_intf_ports_if_not_exists(
|
snat_p_list = self.create_snat_intf_ports_if_not_exists(
|
||||||
context.elevated(), router['id'])
|
context.elevated(), router['id'])
|
||||||
if not snat_p_list:
|
if not snat_p_list:
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
|
import contextlib
|
||||||
import mock
|
import mock
|
||||||
|
|
||||||
from neutron.common import constants as l3_const
|
from neutron.common import constants as l3_const
|
||||||
@ -147,3 +148,22 @@ class L3DvrTestCase(base.BaseTestCase):
|
|||||||
'network_id': ['network_id'],
|
'network_id': ['network_id'],
|
||||||
'device_id': ['agent_id'],
|
'device_id': ['agent_id'],
|
||||||
'device_owner': [l3_const.DEVICE_OWNER_AGENT_GW]})
|
'device_owner': [l3_const.DEVICE_OWNER_AGENT_GW]})
|
||||||
|
|
||||||
|
def test__create_gw_port_with_no_gateway(self):
|
||||||
|
router = {
|
||||||
|
'name': 'foo_router',
|
||||||
|
'admin_state_up': True,
|
||||||
|
'distributed': True,
|
||||||
|
}
|
||||||
|
router_db = self._create_router(router)
|
||||||
|
router_id = router_db['id']
|
||||||
|
self.assertTrue(router_db.extra_attributes.distributed)
|
||||||
|
with contextlib.nested(
|
||||||
|
mock.patch.object(l3_dvr_db.l3_db.L3_NAT_db_mixin,
|
||||||
|
'_create_gw_port'),
|
||||||
|
mock.patch.object(self.mixin,
|
||||||
|
'create_snat_intf_ports_if_not_exists')
|
||||||
|
) as (cw, cs):
|
||||||
|
self.mixin._create_gw_port(
|
||||||
|
self.ctx, router_id, router_db, mock.ANY)
|
||||||
|
self.assertFalse(cs.call_count)
|
||||||
|
Loading…
Reference in New Issue
Block a user