da45177a2f
The tenant_id property of RestClient in tempest was deprecated in 25.0.0. This replaces the deprecated property by the new project_id property to avoid the following warning. WARNING tempest.lib.common.rest_client [-] Deprecated: "tenant_id" property is deprecated for removal, use "project_id" instead Depends-on: https://review.opendev.org/c/openstack/tempest/+/707938 Change-Id: Ie3c32f9f2278b78603a4214c5717df8691ba490a
1401 lines
62 KiB
Python
1401 lines
62 KiB
Python
# Copyright 2016 Cisco Systems, Inc.
|
|
# All rights reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import os
|
|
import random
|
|
|
|
import netaddr
|
|
from neutron_lib.utils import test
|
|
from oslo_concurrency import lockutils
|
|
from oslo_log import log as logging
|
|
from tempest.common import compute
|
|
from tempest.common import utils
|
|
from tempest.common import waiters
|
|
from tempest import config
|
|
from tempest.lib.common.utils import data_utils
|
|
from tempest.lib.common.utils import test_utils
|
|
from tempest.lib import decorators
|
|
|
|
from neutron_tempest_plugin.bgpvpn import base
|
|
from neutron_tempest_plugin.bgpvpn.scenario import manager
|
|
|
|
|
|
CONF = config.CONF
|
|
LOG = logging.getLogger(__name__)
|
|
NET_A = 'A'
|
|
NET_A_BIS = 'A-Bis'
|
|
NET_B = 'B'
|
|
NET_C = 'C'
|
|
|
|
if "SUBNETPOOL_PREFIX_V4" in os.environ:
|
|
subnet_base = netaddr.IPNetwork(os.environ['SUBNETPOOL_PREFIX_V4'])
|
|
if subnet_base.prefixlen > 21:
|
|
raise Exception("if SUBNETPOOL_PREFIX_V4 is set, it needs to offer "
|
|
"space for at least 8 /24 subnets")
|
|
else:
|
|
subnet_base = netaddr.IPNetwork("10.100.0.0/16")
|
|
|
|
|
|
def assign_24(idx):
|
|
# how many addresses in a /24:
|
|
range_size = 2 ** (32 - 24)
|
|
return netaddr.cidr_merge(
|
|
subnet_base[range_size * idx:range_size * (idx + 1)])[0]
|
|
|
|
|
|
S1A = assign_24(1)
|
|
S2A = assign_24(2)
|
|
S1B = assign_24(4)
|
|
S2B = assign_24(6)
|
|
S1C = assign_24(6)
|
|
NET_A_S1 = str(S1A)
|
|
NET_A_S2 = str(S2A)
|
|
NET_B_S1 = str(S1B)
|
|
NET_B_S2 = str(S2B)
|
|
NET_C_S1 = str(S1C)
|
|
IP_A_S1_1 = str(S1A[10])
|
|
IP_B_S1_1 = str(S1B[20])
|
|
IP_C_S1_1 = str(S1C[30])
|
|
IP_A_S1_2 = str(S1A[30])
|
|
IP_B_S1_2 = str(S1B[40])
|
|
IP_A_S1_3 = str(S1A[50])
|
|
IP_B_S1_3 = str(S1B[60])
|
|
IP_A_S2_1 = str(S2A[50])
|
|
IP_B_S2_1 = str(S2B[60])
|
|
IP_A_BIS_S1_1 = IP_A_S1_1
|
|
IP_A_BIS_S1_2 = IP_A_S1_2
|
|
IP_A_BIS_S1_3 = IP_A_S1_3
|
|
IP_A_BIS_S2_1 = IP_A_S2_1
|
|
|
|
|
|
class TestBGPVPNBasic(base.BaseBgpvpnTest, manager.NetworkScenarioTest):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super(TestBGPVPNBasic, cls).setUpClass()
|
|
cls._rt_index = 0
|
|
|
|
@classmethod
|
|
@lockutils.synchronized('bgpvpn')
|
|
def new_rt(cls):
|
|
cls._rt_index += 1
|
|
return "64512:%d" % cls._rt_index
|
|
|
|
def setUp(self):
|
|
super(TestBGPVPNBasic, self).setUp()
|
|
self.servers_keypairs = {}
|
|
self.servers = []
|
|
self.server_fixed_ips = {}
|
|
self.ports = {}
|
|
self.networks = {}
|
|
self.subnets = {}
|
|
self.server_fips = {}
|
|
self._create_security_group_for_test()
|
|
self.RT1 = self.new_rt()
|
|
self.RT2 = self.new_rt()
|
|
self.RT3 = self.new_rt()
|
|
self.RT4 = self.new_rt()
|
|
|
|
@classmethod
|
|
def setup_clients(cls):
|
|
"""This setup the service clients for the tests"""
|
|
super(TestBGPVPNBasic, cls).setup_clients()
|
|
cls.admin_security_group_client = cls.os_admin.security_groups_client
|
|
cls.admin_security_group_rule_client = (
|
|
cls.os_admin.security_group_rules_client)
|
|
cls.admin_routers_client = cls.os_admin.routers_client
|
|
cls.admin_ports_client = cls.os_admin.ports_client
|
|
cls.admin_networks_client = cls.os_admin.networks_client
|
|
cls.admin_subnets_client = cls.os_admin.subnets_client
|
|
cls.admin_fips_client = cls.os_admin.floating_ips_client
|
|
cls.admin_keys_client = cls.os_admin.keypairs_client
|
|
|
|
@decorators.idempotent_id('afdd6cad-871a-4343-b97b-6319c76c815d')
|
|
@utils.services('compute', 'network')
|
|
def test_bgpvpn_basic(self):
|
|
"""This test checks basic BGPVPN.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Start up server 1 in network A
|
|
3. Start up server 2 in network B
|
|
4. Associate network A and network B to a given L3 BGPVPN
|
|
5. Create router and connect it to network A
|
|
6. Give a FIP to server 1
|
|
7. Check that server 1 can ping server 2
|
|
"""
|
|
|
|
self._create_networks_and_subnets()
|
|
self._create_servers()
|
|
self._create_l3_bgpvpn()
|
|
self._associate_all_nets_to_bgpvpn()
|
|
self._associate_fip_and_check_l3_bgpvpn()
|
|
|
|
@decorators.idempotent_id('8a5a6fac-313c-464b-9c5c-29d4e1c0a51e')
|
|
@utils.services('compute', 'network')
|
|
def test_bgpvpn_variant1(self):
|
|
"""This test checks basic BGPVPN.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Associate network A and network B to a given L3 BGPVPN
|
|
3. Start up server 1 in network A
|
|
4. Start up server 2 in network B
|
|
5. Create router and connect it to network A
|
|
6. Give a FIP to server 1
|
|
7. Check that server 1 can ping server 2
|
|
"""
|
|
self._create_networks_and_subnets()
|
|
self._create_l3_bgpvpn()
|
|
self._associate_all_nets_to_bgpvpn()
|
|
self._create_servers()
|
|
self._associate_fip_and_check_l3_bgpvpn()
|
|
|
|
@decorators.idempotent_id('e7468636-0816-4092-82ca-3590680ed00b')
|
|
@utils.services('compute', 'network')
|
|
def test_bgpvpn_variant2(self):
|
|
"""This test checks basic BGPVPN.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Start up server 1 in network A
|
|
3. Start up server 2 in network B
|
|
4. Create router and associate to network B
|
|
5. Associate network A and network B to a given L3 BGPVPN
|
|
6. Create router and connect it to network A
|
|
7. Give a FIP to server 1
|
|
8. Check that server 1 can ping server 2
|
|
"""
|
|
self._create_networks_and_subnets()
|
|
self._create_servers()
|
|
self.router_b = self._create_fip_router(
|
|
client=self.admin_routers_client,
|
|
subnet_id=self.subnets[NET_B][0]['id'])
|
|
self._create_l3_bgpvpn()
|
|
self._associate_all_nets_to_bgpvpn()
|
|
self._associate_fip_and_check_l3_bgpvpn()
|
|
|
|
@decorators.idempotent_id('7c66aa31-fb3a-4e15-8808-46eb361f153a')
|
|
@utils.services('compute', 'network')
|
|
def test_bgpvpn_variant3(self):
|
|
"""This test checks basic BGPVPN.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Start up server 1 in network A
|
|
3. Start up server 2 in network B
|
|
4. Create router and connect it to network B
|
|
5. Associate network A and network B to a given L3 BGPVPN
|
|
6. Delete router associated to network B
|
|
7. Create router and connect it to network A
|
|
8. Give a FIP to server 1
|
|
9. Check that server 1 can ping server 2
|
|
"""
|
|
self._create_networks_and_subnets()
|
|
self._create_servers()
|
|
self.router_b = self._create_fip_router(
|
|
client=self.admin_routers_client,
|
|
subnet_id=self.subnets[NET_B][0]['id'])
|
|
self._create_l3_bgpvpn()
|
|
self._associate_all_nets_to_bgpvpn()
|
|
self._delete_router(self.router_b,
|
|
routers_client=self.admin_routers_client,
|
|
ports_client=self.admin_ports_client)
|
|
self._associate_fip_and_check_l3_bgpvpn()
|
|
|
|
@decorators.idempotent_id('973ab26d-c7d8-4a32-9aa9-2d7e6f406135')
|
|
@utils.services('compute', 'network')
|
|
def test_bgpvpn_variant4(self):
|
|
"""This test checks basic BGPVPN.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Start up server 1 in network A
|
|
3. Start up server 2 in network B
|
|
4. Associate network A and network B to a given L3 BGPVPN
|
|
5. Create router and connect it to network B
|
|
6. Create router and connect it to network A
|
|
7. Give a FIP to server 1
|
|
8. Check that server 2 can ping server 1
|
|
"""
|
|
self._create_networks_and_subnets()
|
|
self._create_servers()
|
|
self._create_l3_bgpvpn()
|
|
self._associate_all_nets_to_bgpvpn()
|
|
self.router_b = self._create_fip_router(
|
|
client=self.admin_routers_client,
|
|
subnet_id=self.subnets[NET_B][0]['id'])
|
|
self._associate_fip_and_check_l3_bgpvpn()
|
|
|
|
@decorators.idempotent_id('2ac0696b-e828-4299-9e94-5f9c4988d961')
|
|
@utils.services('compute', 'network')
|
|
def test_bgpvpn_variant5(self):
|
|
"""This test checks basic BGPVPN.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Create router and connect it to network B
|
|
3. Associate network A and network B to a given L3 BGPVPN
|
|
4. Start up server 1 in network A
|
|
5. Start up server 2 in network B
|
|
6. Create router and connect it to network A
|
|
7. Give a FIP to server 1
|
|
8. Check that server 2 can ping server 1
|
|
"""
|
|
self._create_networks_and_subnets()
|
|
self.router_b = self._create_fip_router(
|
|
client=self.admin_routers_client,
|
|
subnet_id=self.subnets[NET_B][0]['id'])
|
|
self._create_l3_bgpvpn()
|
|
self._associate_all_nets_to_bgpvpn()
|
|
self._create_servers()
|
|
self._associate_fip_and_check_l3_bgpvpn()
|
|
|
|
@decorators.idempotent_id('9081338e-a52e-46bb-a40e-bda24ec4b1bd')
|
|
@utils.services('compute', 'network')
|
|
def test_bgpvpn_variant6(self):
|
|
"""This test checks basic BGPVPN.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Associate network A and network B to a given L3 BGPVPN
|
|
3. Create router and connect it to network B
|
|
4. Start up server 1 in network A
|
|
5. Start up server 2 in network B
|
|
6. Create router and connect it to network A
|
|
7. Give a FIP to server 1
|
|
8. Check that server 2 can ping server 1
|
|
"""
|
|
self._create_networks_and_subnets()
|
|
self._create_l3_bgpvpn()
|
|
self._associate_all_nets_to_bgpvpn()
|
|
self.router_b = self._create_fip_router(
|
|
client=self.admin_routers_client,
|
|
subnet_id=self.subnets[NET_B][0]['id'])
|
|
self._create_servers()
|
|
self._associate_fip_and_check_l3_bgpvpn()
|
|
|
|
@decorators.idempotent_id('133497a1-2788-40f7-be01-b3b64b5ef8cd')
|
|
@utils.services('compute', 'network')
|
|
def test_bgpvpn_update_route_targets_disjoint_targets(self):
|
|
"""This test checks basic BGPVPN route targets update.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Start up server 1 in network A
|
|
3. Start up server 2 in network B
|
|
4. Create L3 BGPVPN with only RT defined
|
|
5. Associate network A to a given L3 BGPVPN
|
|
6. Create router and connect it to network A
|
|
7. Give a FIP to server 1
|
|
8. Check that server 1 can ping server 2
|
|
9. Update L3 BGPVPN to have eRT<>iRT and no RT what is insufficient
|
|
for proper connectivity between network A and B
|
|
10. Check that server 1 cannot ping server 2
|
|
11. Update L3 BGPVPN to have again only RT defined
|
|
12. Check that server 1 can ping again server 2
|
|
"""
|
|
self._create_networks_and_subnets()
|
|
self._create_servers()
|
|
self._create_l3_bgpvpn(rts=[self.RT1], import_rts=[],
|
|
export_rts=[])
|
|
self._associate_all_nets_to_bgpvpn()
|
|
self._associate_fip_and_check_l3_bgpvpn()
|
|
self._update_l3_bgpvpn(rts=[], import_rts=[self.RT1],
|
|
export_rts=[self.RT2])
|
|
self._check_l3_bgpvpn(should_succeed=False)
|
|
self._update_l3_bgpvpn(rts=[self.RT1], import_rts=[], export_rts=[])
|
|
self._check_l3_bgpvpn()
|
|
|
|
@decorators.idempotent_id('bf417cad-0bc4-446a-b367-850aa619ca4f')
|
|
@utils.services('compute', 'network')
|
|
def test_bgpvpn_update_route_targets_common_target(self):
|
|
"""This test checks basic BGPVPN route targets update.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Start up server 1 in network A
|
|
3. Start up server 2 in network B
|
|
4. Create L3 BGPVPN with only RT defined
|
|
5. Associate network A to a given L3 BGPVPN
|
|
6. Create router and connect it to network A
|
|
7. Give a FIP to server 1
|
|
8. Check that server 1 can ping server 2
|
|
9. Update L3 BGPVPN to have eRT<>iRT and RT=iRT
|
|
10. Check that server 1 can ping server 2
|
|
11. Update L3 BGPVPN to have again only RT defined
|
|
12. Check that server 1 can ping again server 2
|
|
"""
|
|
self._create_networks_and_subnets()
|
|
self._create_servers()
|
|
self._create_l3_bgpvpn(rts=[self.RT1], import_rts=[], export_rts=[])
|
|
self._associate_all_nets_to_bgpvpn()
|
|
self._associate_fip_and_check_l3_bgpvpn()
|
|
self._update_l3_bgpvpn(rts=[self.RT1], import_rts=[self.RT1],
|
|
export_rts=[self.RT2])
|
|
self._check_l3_bgpvpn()
|
|
self._update_l3_bgpvpn(rts=[self.RT1], import_rts=[], export_rts=[])
|
|
self._check_l3_bgpvpn()
|
|
|
|
@decorators.idempotent_id('08d4f40e-3cec-485b-9da2-76e67fbd9881')
|
|
@utils.services('compute', 'network')
|
|
def test_bgpvpn_update_route_targets_and_unassociated_net(self):
|
|
"""This test checks basic BGPVPN route targets update.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Start up server 1 in network A
|
|
3. Start up server 2 in network B
|
|
4. Create invalid L3 BGPVPN with eRT<>iRT that is insufficient
|
|
for proper connectivity between network A and B
|
|
5. Associate network A to a given L3 BGPVPN
|
|
6. Create router and connect it to network A
|
|
7. Give a FIP to server 1
|
|
8. Check that server 1 cannot ping server 2
|
|
9. Associate network B to a given L3 BGPVPN
|
|
10. Check that server 1 cannot ping server 2
|
|
11. Update L3 BGPVPN to have only RT defined
|
|
12. Check that server 1 can ping server 2
|
|
"""
|
|
self._create_networks_and_subnets()
|
|
self._create_servers()
|
|
self.router = self._create_router_and_associate_fip(
|
|
0, self.subnets[NET_A][0])
|
|
self._create_l3_bgpvpn(rts=[], export_rts=[self.RT1],
|
|
import_rts=[self.RT2])
|
|
self.bgpvpn_admin_client.create_network_association(
|
|
self.bgpvpn['id'], self.networks[NET_A]['id'])
|
|
self._check_l3_bgpvpn(should_succeed=False)
|
|
self.bgpvpn_admin_client.create_network_association(
|
|
self.bgpvpn['id'], self.networks[NET_B]['id'])
|
|
self._check_l3_bgpvpn(should_succeed=False)
|
|
self._update_l3_bgpvpn(rts=[self.RT1], import_rts=[], export_rts=[])
|
|
self._check_l3_bgpvpn()
|
|
|
|
@test.unstable_test("bug 1897408")
|
|
@decorators.idempotent_id('c8bfd695-f731-47a6-86e3-3dfa492e08e0')
|
|
@utils.services('compute', 'network')
|
|
def test_bgpvpn_update_rt_and_keep_local_connectivity_variant1(self):
|
|
"""This test checks basic BGPVPN route targets update.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Start up server 1 in network A
|
|
3. Start up server 2 in network B
|
|
4. Start up server 3 in network A
|
|
5. Start up server 4 in network B
|
|
6. Create invalid L3 BGPVPN with eRT<>iRT that is insufficient
|
|
for proper connectivity between network A and B
|
|
7. Associate network A to a given L3 BGPVPN
|
|
8. Create router A and connect it to network A
|
|
9. Give a FIP to server 1
|
|
10. Check that server 1 cannot ping server 2
|
|
11. Check that server 1 can ping server 3
|
|
12. Associate network B to a given L3 BGPVPN
|
|
13. Create router B and connect it to network B
|
|
14. Give a FIP to server 2
|
|
15. Check that server 1 still cannot ping server 2
|
|
16. Check that server 2 can ping server 4
|
|
17. Update L3 BGPVPN to have now only RT defined
|
|
18. Check that server 1 can now ping server 2
|
|
19. Check that server 1 still can ping server 3
|
|
20. Check that server 2 still can ping server 4
|
|
"""
|
|
self._create_networks_and_subnets()
|
|
self._create_l3_bgpvpn(rts=[], import_rts=[self.RT1],
|
|
export_rts=[self.RT2])
|
|
self._create_servers([[self.networks[NET_A], IP_A_S1_1],
|
|
[self.networks[NET_B], IP_B_S1_1],
|
|
[self.networks[NET_A], IP_A_S1_2],
|
|
[self.networks[NET_B], IP_B_S1_2]])
|
|
self.bgpvpn_admin_client.create_network_association(
|
|
self.bgpvpn['id'], self.networks[NET_A]['id'])
|
|
self.router_a = self._create_router_and_associate_fip(
|
|
0, self.subnets[NET_A][0])
|
|
self._check_l3_bgpvpn(should_succeed=False)
|
|
self._check_l3_bgpvpn(self.servers[0], self.servers[2])
|
|
self.bgpvpn_admin_client.create_network_association(
|
|
self.bgpvpn['id'], self.networks[NET_B]['id'])
|
|
self.router_b = self._create_router_and_associate_fip(
|
|
1, self.subnets[NET_B][0])
|
|
self._check_l3_bgpvpn(should_succeed=False)
|
|
self._check_l3_bgpvpn(self.servers[1], self.servers[3])
|
|
self._update_l3_bgpvpn(rts=[self.RT1], import_rts=[], export_rts=[])
|
|
self._check_l3_bgpvpn()
|
|
self._check_l3_bgpvpn(self.servers[0], self.servers[2])
|
|
self._check_l3_bgpvpn(self.servers[1], self.servers[3])
|
|
|
|
@test.unstable_test("bug 1897408")
|
|
@decorators.idempotent_id('758a8731-5070-4b1e-9a66-d6ff05bb5be1')
|
|
@utils.services('compute', 'network')
|
|
def test_bgpvpn_update_rt_and_keep_local_connectivity_variant2(self):
|
|
"""This test checks basic BGPVPN route targets update.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Start up server 1 in network A
|
|
3. Start up server 2 in network B
|
|
4. Start up server 3 in network A
|
|
5. Start up server 4 in network B
|
|
6. Create invalid L3 BGPVPN with eRT<>iRT that is insufficient
|
|
for proper connectivity between network A and B
|
|
7. Create router A and connect it to network A
|
|
8. Give a FIP to server 1
|
|
9. Create router B and connect it to network B
|
|
10. Give a FIP to server 4
|
|
11. Associate network A to a given L3 BGPVPN
|
|
12. Check that server 1 cannot ping server 2
|
|
13. Check that server 1 can ping server 3
|
|
14. Associate router B to a given L3 BGPVPN
|
|
15. Check that server 1 still cannot ping server 2
|
|
16. Check that server 4 can ping server 2
|
|
17. Update L3 BGPVPN to have now only RT defined
|
|
18. Check that server 1 can now ping server 2
|
|
19. Check that server 1 still can ping server 3
|
|
20. Check that server 4 still can ping server 2
|
|
"""
|
|
self._create_networks_and_subnets()
|
|
self._create_l3_bgpvpn(rts=[], import_rts=[self.RT1],
|
|
export_rts=[self.RT2])
|
|
self._create_servers([[self.networks[NET_A], IP_A_S1_1],
|
|
[self.networks[NET_B], IP_B_S1_1],
|
|
[self.networks[NET_A], IP_A_S1_2],
|
|
[self.networks[NET_B], IP_B_S1_2]])
|
|
self._create_router_and_associate_fip(
|
|
0, self.subnets[NET_A][0])
|
|
router_b = self._create_router_and_associate_fip(
|
|
3, self.subnets[NET_B][0])
|
|
self.bgpvpn_admin_client.create_network_association(
|
|
self.bgpvpn['id'], self.networks[NET_A]['id'])
|
|
self._check_l3_bgpvpn(should_succeed=False)
|
|
self._check_l3_bgpvpn(self.servers[0], self.servers[2])
|
|
self.bgpvpn_admin_client.create_router_association(self.bgpvpn['id'],
|
|
router_b['id'])
|
|
self._check_l3_bgpvpn(should_succeed=False)
|
|
self._check_l3_bgpvpn(self.servers[3], self.servers[1])
|
|
self._update_l3_bgpvpn(rts=[self.RT1], import_rts=[], export_rts=[])
|
|
self._check_l3_bgpvpn()
|
|
self._check_l3_bgpvpn(self.servers[0], self.servers[2])
|
|
self._check_l3_bgpvpn(self.servers[3], self.servers[1])
|
|
|
|
@decorators.idempotent_id('876b49bc-f34a-451b-ba3c-d74295838130')
|
|
@utils.services('compute', 'network')
|
|
@utils.requires_ext(extension='bgpvpn-routes-control', service='network')
|
|
def test_bgpvpn_port_association_local_pref(self):
|
|
"""This test checks port association in BGPVPN.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Create L3 BGPVPN
|
|
3. Start up server 1 in network A
|
|
4. Start up server 2 in network B
|
|
5. Start up server 3 in network B
|
|
6. Create router and connect it to network A
|
|
7. Create router and connect it to network B
|
|
8. Give a FIP to all servers
|
|
9. Setup dummy HTTP service on server 2 and 3
|
|
10. Configure ip forwarding on server 2
|
|
11. Configure ip forwarding on server 3
|
|
12. Configure alternative loopback address on server 2
|
|
13. Configure alternative loopback address on server 3
|
|
14. Associate network A to a given L3 BGPVPN
|
|
15. Associate port of server 2 to a given L3 BGPVPN
|
|
with higher local_pref value
|
|
16. Associate port of server 3 to a given L3 BGPVPN
|
|
with lower local_pref value
|
|
17. Check that server 1 pings server's 2 alternative ip
|
|
18. Update port association of server 2 to have now
|
|
lower local_pref value
|
|
19. Update port association of server 3 to have now
|
|
higher local_pref value
|
|
20. Check that server 1 pings now server's 3 alternative ip
|
|
"""
|
|
self._create_networks_and_subnets(port_security=False)
|
|
self._create_l3_bgpvpn()
|
|
self._create_servers([[self.networks[NET_A], IP_A_S1_1],
|
|
[self.networks[NET_B], IP_B_S1_1],
|
|
[self.networks[NET_B], IP_B_S1_2]],
|
|
port_security=False)
|
|
self._create_fip_router(subnet_id=self.subnets[NET_A][0]['id'])
|
|
self._create_fip_router(subnet_id=self.subnets[NET_B][0]['id'])
|
|
self._associate_fip(0)
|
|
self._associate_fip(1)
|
|
self._associate_fip(2)
|
|
self._setup_http_server(1)
|
|
self._setup_http_server(2)
|
|
self._setup_ip_forwarding(1)
|
|
self._setup_ip_forwarding(2)
|
|
self._setup_ip_address(1, IP_C_S1_1)
|
|
self._setup_ip_address(2, IP_C_S1_1)
|
|
|
|
primary_port_routes = [{'type': 'prefix',
|
|
'local_pref': 200,
|
|
'prefix': NET_C_S1}]
|
|
alternate_port_routes = [{'type': 'prefix',
|
|
'local_pref': 100,
|
|
'prefix': NET_C_S1}]
|
|
|
|
self.bgpvpn_admin_client.create_network_association(
|
|
self.bgpvpn['id'], self.networks[NET_A]['id'])
|
|
|
|
port_id_1 = self.ports[self.servers[1]['id']]['id']
|
|
body = self.bgpvpn_admin_client.create_port_association(
|
|
self.bgpvpn['id'], port_id=port_id_1, routes=primary_port_routes)
|
|
port_association_1 = body['port_association']
|
|
|
|
port_id_2 = self.ports[self.servers[2]['id']]['id']
|
|
body = self.bgpvpn_admin_client.create_port_association(
|
|
self.bgpvpn['id'], port_id=port_id_2, routes=alternate_port_routes)
|
|
port_association_2 = body['port_association']
|
|
|
|
destination_srv_1 = '%s:%s' % (self.servers[1]['name'],
|
|
self.servers[1]['id'])
|
|
destination_srv_2 = '%s:%s' % (self.servers[2]['name'],
|
|
self.servers[2]['id'])
|
|
|
|
self._check_l3_bgpvpn_by_specific_ip(
|
|
to_server_ip=IP_C_S1_1,
|
|
validate_server=destination_srv_1)
|
|
|
|
self.bgpvpn_admin_client.update_port_association(
|
|
self.bgpvpn['id'], port_association_1['id'],
|
|
routes=alternate_port_routes)
|
|
self.bgpvpn_admin_client.update_port_association(
|
|
self.bgpvpn['id'], port_association_2['id'],
|
|
routes=primary_port_routes)
|
|
|
|
self._check_l3_bgpvpn_by_specific_ip(
|
|
to_server_ip=IP_C_S1_1,
|
|
validate_server=destination_srv_2)
|
|
|
|
@test.unstable_test("bug 1897408")
|
|
@decorators.idempotent_id('f762e6ac-920e-4d0f-aa67-02bdd4ab8433')
|
|
@utils.services('compute', 'network')
|
|
def test_bgpvpn_tenant_separation_and_local_connectivity(self):
|
|
"""This test checks tenant separation for BGPVPN.
|
|
|
|
1. Create networks A with subnet S1 and S2
|
|
2. Create networks A-Bis with subnet S1 and S2 (like for network A)
|
|
3. Create L3 BGPVPN for network A with self.RT1
|
|
4. Create L3 BGPVPN for network A-Bis with self.RT2
|
|
5. Associate network A to a given L3 BGPVPN
|
|
6. Associate network A-Bis to a given L3 BGPVPN
|
|
7. Start up server 1 in network A and subnet S1
|
|
8. Start up server 2 in network A-Bis and subnet S1
|
|
9. Start up server 3 in network A and subnet S1
|
|
10. Start up server 4 in network A-Bis and subnet S1
|
|
11. Start up server 5 in network A and subnet S1
|
|
12. Create router A and connect it to network A
|
|
13. Create router A-Bis and connect it to network A-Bis
|
|
14. Give a FIP to all servers
|
|
15. Setup dummy HTTP service on server 2 and 3
|
|
16. Check that server 1 pings server 3 instead of server 2
|
|
17. Check that server 1 can ping server 3
|
|
18. Check that server 2 cannot ping server 1
|
|
19. Check that server 2 pings itself instead of server 3
|
|
20. Check that server 2 can ping server 4
|
|
21. Check that server 2 pings server 4 instead of server 5
|
|
"""
|
|
self._create_networks_and_subnets([NET_A, NET_A_BIS],
|
|
[[NET_A_S1, NET_A_S2],
|
|
[NET_A_S1, NET_A_S2]])
|
|
bgpvpn_a = self._create_l3_bgpvpn(name='test-l3-bgpvpn-a',
|
|
rts=[self.RT1])
|
|
bgpvpn_a_bis = self._create_l3_bgpvpn(name='test-l3-bgpvpn-a-bis',
|
|
rts=[self.RT2])
|
|
self.bgpvpn_admin_client.create_network_association(
|
|
bgpvpn_a['id'], self.networks[NET_A]['id'])
|
|
self.bgpvpn_admin_client.create_network_association(
|
|
bgpvpn_a_bis['id'], self.networks[NET_A_BIS]['id'])
|
|
self._create_servers([[self.networks[NET_A], IP_A_S1_1],
|
|
[self.networks[NET_A_BIS], IP_A_BIS_S1_2],
|
|
[self.networks[NET_A], IP_A_S1_2],
|
|
[self.networks[NET_A_BIS], IP_A_BIS_S1_3],
|
|
[self.networks[NET_A], IP_A_S1_3]])
|
|
self._create_fip_router(subnet_id=self.subnets[NET_A][0]['id'])
|
|
self._create_fip_router(subnet_id=self.subnets[NET_A_BIS][0]['id'])
|
|
self._associate_fip(0)
|
|
self._associate_fip(1)
|
|
self._associate_fip(2)
|
|
self._associate_fip(3)
|
|
self._associate_fip(4)
|
|
self._setup_http_server(1)
|
|
self._setup_http_server(2)
|
|
self._setup_http_server(3)
|
|
self._setup_http_server(4)
|
|
self._check_l3_bgpvpn(self.servers[0], self.servers[1],
|
|
should_succeed=False, validate_server=True)
|
|
self._check_l3_bgpvpn(self.servers[0], self.servers[2],
|
|
validate_server=True)
|
|
self._check_l3_bgpvpn(self.servers[1], self.servers[0],
|
|
should_succeed=False)
|
|
self._check_l3_bgpvpn(self.servers[1], self.servers[2],
|
|
should_succeed=False, validate_server=True)
|
|
self._check_l3_bgpvpn(self.servers[1], self.servers[3],
|
|
validate_server=True)
|
|
self._check_l3_bgpvpn(self.servers[1], self.servers[4],
|
|
should_succeed=False, validate_server=True)
|
|
|
|
@decorators.idempotent_id('3b44b2f4-f514-4004-8623-2682bc46bb07')
|
|
@utils.services('compute', 'network')
|
|
@utils.requires_ext(extension='bgpvpn-routes-control', service='network')
|
|
def test_bgpvpn_port_association_create_and_update(self):
|
|
"""This test checks port association in BGPVPN.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Create L3 BGPVPN
|
|
3. Create router and connect it to network A
|
|
4. Create router and connect it to network B
|
|
5. Start up server 1 in network A
|
|
6. Start up server 2 in network B
|
|
7. Give a FIP to all servers
|
|
8. Configure ip forwarding on server 2
|
|
9. Configure alternative loopback address on server 2
|
|
10. Associate network A to a given L3 BGPVPN
|
|
11. Associate port of server 2 to a given L3 BGPVPN
|
|
12. Check that server 1 can ping server's 2 alternative ip
|
|
13. Update created before port association by routes removal
|
|
14. Check that server 1 cannot ping server's 2 alternative ip
|
|
"""
|
|
self._create_networks_and_subnets(port_security=False)
|
|
self._create_l3_bgpvpn()
|
|
self._create_servers([[self.networks[NET_A], IP_A_S1_1],
|
|
[self.networks[NET_B], IP_B_S1_1]],
|
|
port_security=False)
|
|
self._create_fip_router(subnet_id=self.subnets[NET_A][0]['id'])
|
|
self._create_fip_router(subnet_id=self.subnets[NET_B][0]['id'])
|
|
self._associate_fip(0)
|
|
self._associate_fip(1)
|
|
|
|
# preliminary check that no connectivity to 192.168.0.1 initially
|
|
# exists
|
|
self._check_l3_bgpvpn_by_specific_ip(
|
|
should_succeed=False, to_server_ip=IP_C_S1_1)
|
|
|
|
self._setup_ip_forwarding(1)
|
|
self._setup_ip_address(1, IP_C_S1_1)
|
|
self.bgpvpn_admin_client.create_network_association(
|
|
self.bgpvpn['id'], self.networks[NET_A]['id'])
|
|
port_id = self.ports[self.servers[1]['id']]['id']
|
|
port_routes = [{'type': 'prefix',
|
|
'prefix': NET_C_S1}]
|
|
body = self.bgpvpn_admin_client.create_port_association(
|
|
self.bgpvpn['id'], port_id=port_id, routes=port_routes)
|
|
port_association = body['port_association']
|
|
self._check_l3_bgpvpn_by_specific_ip(
|
|
to_server_ip=IP_C_S1_1)
|
|
self.bgpvpn_admin_client.update_port_association(
|
|
self.bgpvpn['id'], port_association['id'], routes=[])
|
|
self._check_l3_bgpvpn_by_specific_ip(
|
|
should_succeed=False, to_server_ip=IP_C_S1_1)
|
|
|
|
@decorators.idempotent_id('d92a8a18-c4d0-40d5-8592-713d7dae7d25')
|
|
@utils.services('compute', 'network')
|
|
@utils.requires_ext(extension='bgpvpn-routes-control', service='network')
|
|
@test.unstable_test("bug 1780205")
|
|
def test_port_association_many_bgpvpn_routes(self):
|
|
"""This test checks port association in BGPVPN.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Create L3 BGPVPN
|
|
3. Create router and connect it to network A
|
|
4. Create router and connect it to network B
|
|
5. Start up server 1 in network A
|
|
6. Start up server 2 in network B
|
|
7. Give a FIP to all servers
|
|
8. Configure ip forwarding on server 2
|
|
9. Configure alternative loopback address on server 2
|
|
10. Associate network A to a given L3 BGPVPN
|
|
11. Associate port of server 2 to a given L3 BGPVPN
|
|
12. Check that server 1 can ping server's 2 alternative ip
|
|
13. Update created before port association by routes removal
|
|
14. Check that server 1 cannot ping server's 2 alternative ip
|
|
"""
|
|
AMOUNT_LOOPBACKS = 90
|
|
START_IP_LOOPBACKS = 31
|
|
SAMPLE_SIZE = 10
|
|
LOOPBACKS = [str(ip) for ip in
|
|
S1C[START_IP_LOOPBACKS:
|
|
START_IP_LOOPBACKS + AMOUNT_LOOPBACKS]]
|
|
SUB_LOOPBACKS = [LOOPBACKS[0], LOOPBACKS[-1]]
|
|
|
|
self._create_networks_and_subnets(port_security=False)
|
|
self._create_l3_bgpvpn()
|
|
self._create_servers([[self.networks[NET_A], IP_A_S1_1],
|
|
[self.networks[NET_B], IP_B_S1_1]],
|
|
port_security=False)
|
|
self._create_fip_router(subnet_id=self.subnets[NET_A][0]['id'])
|
|
self._create_fip_router(subnet_id=self.subnets[NET_B][0]['id'])
|
|
self._associate_fip(0)
|
|
self._associate_fip(1)
|
|
|
|
for ip in SUB_LOOPBACKS:
|
|
LOG.debug("Preliminary check that no connectivity exist")
|
|
self._check_l3_bgpvpn_by_specific_ip(
|
|
should_succeed=False, to_server_ip=ip)
|
|
|
|
self._setup_ip_forwarding(1)
|
|
|
|
self._setup_range_ip_address(1, LOOPBACKS)
|
|
|
|
self.bgpvpn_admin_client.create_network_association(
|
|
self.bgpvpn['id'], self.networks[NET_A]['id'])
|
|
port_id = self.ports[self.servers[1]['id']]['id']
|
|
port_routes = [{'type': 'prefix',
|
|
'prefix': ip + "/32"}
|
|
for ip in LOOPBACKS]
|
|
|
|
body = self.bgpvpn_admin_client.create_port_association(
|
|
self.bgpvpn['id'], port_id=port_id, routes=port_routes)
|
|
port_association = body['port_association']
|
|
|
|
for ip in random.sample(LOOPBACKS, SAMPLE_SIZE):
|
|
LOG.debug("Check that server 1 can "
|
|
"ping server 2 alternative ip %s", ip)
|
|
self._check_l3_bgpvpn_by_specific_ip(
|
|
to_server_ip=ip)
|
|
|
|
self.bgpvpn_admin_client.update_port_association(
|
|
self.bgpvpn['id'], port_association['id'], routes=[])
|
|
|
|
for ip in SUB_LOOPBACKS:
|
|
LOG.debug("Check that server 1 can't "
|
|
"ping server 2 alternative ip %s", ip)
|
|
self._check_l3_bgpvpn_by_specific_ip(
|
|
should_succeed=False, to_server_ip=ip)
|
|
|
|
@decorators.idempotent_id('9c3280b5-0b32-4562-800c-0b50d9d52bfd')
|
|
@utils.services('compute', 'network')
|
|
@utils.requires_ext(extension='bgpvpn-routes-control', service='network')
|
|
def test_bgpvpn_port_association_create_and_delete(self):
|
|
"""This test checks port association in BGPVPN.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Create L3 BGPVPN
|
|
3. Create router and connect it to network A
|
|
4. Create router and connect it to network B
|
|
5. Start up server 1 in network A
|
|
6. Start up server 2 in network B
|
|
7. Give a FIP to all servers
|
|
8. Configure ip forwarding on server 2
|
|
9. Configure alternative loopback address on server 2
|
|
10. Associate network A to a given L3 BGPVPN
|
|
11. Associate port of server 2 to a given L3 BGPVPN
|
|
12. Check that server 1 can ping server's 2 alternative ip
|
|
13. Remove created before port association
|
|
14. Check that server 1 cannot ping server's 2 alternative ip
|
|
"""
|
|
self._create_networks_and_subnets(port_security=False)
|
|
self._create_l3_bgpvpn()
|
|
self._create_servers([[self.networks[NET_A], IP_A_S1_1],
|
|
[self.networks[NET_B], IP_B_S1_1]],
|
|
port_security=False)
|
|
self._create_fip_router(subnet_id=self.subnets[NET_A][0]['id'])
|
|
self._create_fip_router(subnet_id=self.subnets[NET_B][0]['id'])
|
|
self._associate_fip(0)
|
|
self._associate_fip(1)
|
|
|
|
# preliminary check that no connectivity to 192.168.0.1 initially
|
|
# exists
|
|
self._check_l3_bgpvpn_by_specific_ip(
|
|
should_succeed=False, to_server_ip=IP_C_S1_1)
|
|
|
|
self._setup_ip_forwarding(1)
|
|
self._setup_ip_address(1, IP_C_S1_1)
|
|
self.bgpvpn_admin_client.create_network_association(
|
|
self.bgpvpn['id'], self.networks[NET_A]['id'])
|
|
port_id = self.ports[self.servers[1]['id']]['id']
|
|
port_routes = [{'type': 'prefix',
|
|
'prefix': NET_C_S1}]
|
|
body = self.bgpvpn_admin_client.create_port_association(
|
|
self.bgpvpn['id'], port_id=port_id, routes=port_routes)
|
|
port_association = body['port_association']
|
|
self._check_l3_bgpvpn_by_specific_ip(
|
|
to_server_ip=IP_C_S1_1)
|
|
self.bgpvpn_admin_client.delete_port_association(
|
|
self.bgpvpn['id'], port_association['id'])
|
|
self._check_l3_bgpvpn_by_specific_ip(
|
|
should_succeed=False, to_server_ip=IP_C_S1_1)
|
|
|
|
@decorators.idempotent_id('73f629fa-fdae-40fc-8a7e-da3aedcf797a')
|
|
@utils.services('compute', 'network')
|
|
@utils.requires_ext(extension='bgpvpn-routes-control', service='network')
|
|
def test_bgpvpn_port_association_bgpvpn_route(self):
|
|
"""Test port association routes of type 'bgpvpn'
|
|
|
|
In this test we use a Port Association with a 'bgpvpn' route
|
|
to have VM 1 in network A, reach a VM 3 in network C via the Port
|
|
of a VM 2 (on network B), and vice-versa. For A->C traffic, one Port
|
|
Association associates the port of VM 2 to a BGPVPN, with a route of
|
|
type 'bgpvpn' redistributing routes from network C. For C->A traffic,
|
|
another Port Association associates the port of VM 2 to a BGPVPN, with
|
|
a route of type 'bgpvpn' redistributing routes from network A.
|
|
|
|
The use of RT in this test is a bit complex, and would be much
|
|
simpler if we were using a VM with two interfaces.
|
|
|
|
We confirm that VM 1 can join VM 3, and we confirm that the traffic
|
|
actually goes through VM 2, by turning ip_forwaring off then on in VM2.
|
|
"""
|
|
# create networks A, B and C with their respective subnets
|
|
self._create_networks_and_subnets(port_security=False)
|
|
|
|
RT_to_A = self.RT1
|
|
RT_from_A = self.RT2
|
|
RT_to_C = self.RT3
|
|
RT_from_C = self.RT4
|
|
|
|
# Create L3 BGPVPN for network A
|
|
bgpvpn_a = self._create_l3_bgpvpn(name="test-vpn-a",
|
|
import_rts=[RT_to_A],
|
|
export_rts=[RT_from_A])
|
|
|
|
# Create L3 BGPVPN for network C
|
|
bgpvpn_c = self._create_l3_bgpvpn(name="test-vpn-c",
|
|
import_rts=[RT_to_C],
|
|
export_rts=[RT_from_C])
|
|
|
|
# Create L3 BGPVPN for network B
|
|
bgpvpn_b = self._create_l3_bgpvpn(name="test-vpn-b",
|
|
import_rts=[RT_from_C, RT_from_A])
|
|
|
|
# BGPVPNs to only export into A and C
|
|
bgpvpn_to_a = self._create_l3_bgpvpn(name="test-vpn-to-a",
|
|
export_rts=[RT_to_A])
|
|
bgpvpn_to_c = self._create_l3_bgpvpn(name="test-vpn-to-c",
|
|
export_rts=[RT_to_C])
|
|
|
|
# create the three VMs
|
|
self._create_servers([[self.networks[NET_A], IP_A_S1_1],
|
|
[self.networks[NET_B], IP_B_S1_1],
|
|
[self.networks[NET_C], IP_C_S1_1]],
|
|
port_security=False)
|
|
vm1, vm2, vm3 = self.servers
|
|
|
|
# Create one router for each of network A, B, C and give floating
|
|
# IPs to servers 1, 2, 3
|
|
self._create_fip_router(subnet_id=self.subnets[NET_A][0]['id'])
|
|
self._create_fip_router(subnet_id=self.subnets[NET_B][0]['id'])
|
|
self._create_fip_router(subnet_id=self.subnets[NET_C][0]['id'])
|
|
self._associate_fip(0)
|
|
self._associate_fip(1)
|
|
self._associate_fip(2)
|
|
|
|
# disable IP forwarding on VM2
|
|
self._setup_ip_forwarding(0)
|
|
|
|
# connect network A to its BGPVPN
|
|
self.bgpvpn_admin_client.create_network_association(
|
|
bgpvpn_a['id'], self.networks[NET_A]['id'])
|
|
|
|
# connect network B to its BGPVPN
|
|
self.bgpvpn_admin_client.create_network_association(
|
|
bgpvpn_b['id'], self.networks[NET_B]['id'])
|
|
|
|
# connect network C to its BGPVPN
|
|
self.bgpvpn_admin_client.create_network_association(
|
|
bgpvpn_c['id'], self.networks[NET_C]['id'])
|
|
|
|
# create port associations for A->C traffic
|
|
# (leak routes imported by BGPVPN B -- which happen to include the
|
|
# routes net C -- into net A)
|
|
self.bgpvpn_admin_client.create_port_association(
|
|
bgpvpn_to_a['id'],
|
|
port_id=self.ports[vm2['id']]['id'],
|
|
routes=[{'type': 'bgpvpn',
|
|
'bgpvpn_id': bgpvpn_b['id']},
|
|
])
|
|
|
|
# create port associations for C->A traffic
|
|
# (leak routes imported by BGPVPN B -- which happen to include the
|
|
# routes from net A -- into net C)
|
|
body = self.bgpvpn_admin_client.create_port_association(
|
|
bgpvpn_to_c['id'],
|
|
port_id=self.ports[vm2['id']]['id'],
|
|
routes=[{'type': 'bgpvpn',
|
|
'bgpvpn_id': bgpvpn_a['id']}])
|
|
|
|
port_association = body['port_association']
|
|
|
|
# check that we don't have connectivity
|
|
# (because destination is supposed to be reachable via VM2, which
|
|
# still has ip_forwarding disabled)
|
|
self._check_l3_bgpvpn_by_specific_ip(from_server=vm1,
|
|
to_server_ip=IP_C_S1_1,
|
|
should_succeed=False)
|
|
|
|
# enable IP forwarding on VM2
|
|
self._setup_ip_forwarding(1)
|
|
|
|
# VM1 should now be able to join VM2
|
|
self._check_l3_bgpvpn_by_specific_ip(from_server=vm1,
|
|
to_server_ip=IP_C_S1_1,
|
|
should_succeed=True)
|
|
|
|
# remove port association 1
|
|
self.bgpvpn_admin_client.delete_port_association(self.bgpvpn['id'],
|
|
port_association['id'])
|
|
|
|
# check that connectivity is actually interrupted
|
|
self._check_l3_bgpvpn_by_specific_ip(from_server=vm1,
|
|
to_server_ip=IP_C_S1_1,
|
|
should_succeed=False)
|
|
|
|
@decorators.idempotent_id('8478074e-22df-4234-b02b-61257b475b18')
|
|
@utils.services('compute', 'network')
|
|
def test_bgpvpn_negative_ping_to_unassociated_net(self):
|
|
"""This test checks basic BGPVPN.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Create L3 BGPVPN
|
|
3. Associate network A to a given L3 BGPVPN
|
|
4. Start up server 1 in network A
|
|
5. Start up server 2 in network B
|
|
6. Create router and connect it to network A
|
|
7. Give a FIP to server 1
|
|
8. Check that server 1 cannot ping server 2
|
|
"""
|
|
self._create_networks_and_subnets()
|
|
self._create_l3_bgpvpn()
|
|
self.bgpvpn_admin_client.create_network_association(
|
|
self.bgpvpn['id'], self.networks[NET_A]['id'])
|
|
self._create_servers()
|
|
self._associate_fip_and_check_l3_bgpvpn(should_succeed=False)
|
|
|
|
@decorators.idempotent_id('b6d219b2-90bb-431f-a566-bf6a780d1578')
|
|
@utils.services('compute', 'network')
|
|
def test_bgpvpn_negative_disjoint_import_export(self):
|
|
"""This test checks basic BGPVPN.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Create invalid L3 BGPVPN with eRT<>iRT that is insufficient
|
|
for proper connectivity between network A and B
|
|
3. Associate network A and B to a given L3 BGPVPN
|
|
4. Start up server 1 in network A
|
|
5. Start up server 2 in network B
|
|
6. Create router and connect it to network A
|
|
7. Give a FIP to server 1
|
|
8. Check that server 1 cannot ping server 2
|
|
"""
|
|
self._create_networks_and_subnets()
|
|
self._create_l3_bgpvpn(rts=[], import_rts=[self.RT1],
|
|
export_rts=[self.RT2])
|
|
self._associate_all_nets_to_bgpvpn()
|
|
self._create_servers()
|
|
self._associate_fip_and_check_l3_bgpvpn(should_succeed=False)
|
|
|
|
@decorators.idempotent_id('dc92643f-1b2c-4a3e-bc5e-ea780d721ef7')
|
|
@utils.services('compute', 'network')
|
|
def test_bgpvpn_negative_delete_bgpvpn(self):
|
|
"""This test checks BGPVPN delete.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Create L3 BGPVPN
|
|
3. Associate network A and network B to a given L3 BGPVPN
|
|
4. Start up server 1 in network A
|
|
5. Start up server 2 in network B
|
|
6. Create router and connect it to network A
|
|
7. Give a FIP to server 1
|
|
8. Check that server 1 can ping server 2
|
|
9. Delete L3 BGPVPN
|
|
10. Check that server 1 cannot ping server 2
|
|
"""
|
|
self._create_networks_and_subnets()
|
|
self._create_l3_bgpvpn()
|
|
self._associate_all_nets_to_bgpvpn()
|
|
self._create_servers()
|
|
self._associate_fip_and_check_l3_bgpvpn()
|
|
self.delete_bgpvpn(self.bgpvpn_admin_client, self.bgpvpn)
|
|
self._check_l3_bgpvpn(should_succeed=False)
|
|
|
|
@decorators.idempotent_id('2e6bf893-1410-4ef6-9948-1877f3a8f3d1')
|
|
@utils.services('compute', 'network')
|
|
def test_bgpvpn_negative_delete_net_association(self):
|
|
"""This test checks BGPVPN net association delete.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Create L3 BGPVPN
|
|
3. Associate network A and network B to a given L3 BGPVPN
|
|
4. Start up server 1 in network A
|
|
5. Start up server 2 in network B
|
|
6. Create router and connect it to network A
|
|
7. Give a FIP to server 1
|
|
8. Check that server 1 can ping server 2
|
|
9. Delete association of network A
|
|
10. Check that server 1 cannot ping server 2
|
|
"""
|
|
self._create_networks_and_subnets()
|
|
self._create_l3_bgpvpn()
|
|
body = self.bgpvpn_admin_client.create_network_association(
|
|
self.bgpvpn['id'], self.networks[NET_A]['id'])
|
|
assoc_b = body['network_association']
|
|
self.bgpvpn_admin_client.create_network_association(
|
|
self.bgpvpn['id'], self.networks[NET_B]['id'])
|
|
self._create_servers()
|
|
self._associate_fip_and_check_l3_bgpvpn()
|
|
self.bgpvpn_admin_client.delete_network_association(self.bgpvpn['id'],
|
|
assoc_b['id'])
|
|
self._check_l3_bgpvpn(should_succeed=False)
|
|
|
|
@decorators.idempotent_id('9ebf4342-4448-4d63-98f9-44d3a606b6cf')
|
|
@utils.services('compute', 'network')
|
|
def test_bgpvpn_negative_delete_router_association(self):
|
|
"""This test checks BGPVPN router association delete.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Create router and connect it to network B
|
|
3. Create L3 BGPVPN
|
|
4. Associate network A to a given L3 BGPVPN
|
|
5. Associate router B to a given L3 BGPVPN
|
|
6. Start up server 1 in network A
|
|
7. Start up server 2 in network B
|
|
8. Create router and connect it to network A
|
|
9. Give a FIP to server 1
|
|
10. Check that server 1 can ping server 2
|
|
11. Delete association of router B
|
|
12. Check that server 1 cannot ping server 2
|
|
"""
|
|
self._create_networks_and_subnets()
|
|
router_b = self._create_fip_router(
|
|
subnet_id=self.subnets[NET_B][0]['id'])
|
|
self._create_l3_bgpvpn()
|
|
self.bgpvpn_admin_client.create_network_association(
|
|
self.bgpvpn['id'], self.networks[NET_A]['id'])
|
|
body = self.bgpvpn_admin_client.create_router_association(
|
|
self.bgpvpn['id'], router_b['id'])
|
|
assoc_b = body['router_association']
|
|
self._create_servers()
|
|
self._associate_fip_and_check_l3_bgpvpn()
|
|
self.bgpvpn_admin_client.delete_router_association(self.bgpvpn['id'],
|
|
assoc_b['id'])
|
|
self._check_l3_bgpvpn(should_succeed=False)
|
|
|
|
@decorators.idempotent_id('be4471b3-5f57-4022-b719-b45a673a728b')
|
|
@utils.services('compute', 'network')
|
|
def test_bgpvpn_negative_update_to_disjoint_import_export(self):
|
|
"""This test checks basic BGPVPN route targets update.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Create L3 BGPVPN with only RT defined
|
|
3. Start up server 1 in network A
|
|
4. Start up server 2 in network B
|
|
5. Associate network A to a given L3 BGPVPN
|
|
6. Create router and connect it to network A
|
|
7. Give a FIP to server 1
|
|
8. Check that server 1 can ping server 2
|
|
9. Update L3 BGPVPN to have eRT<>iRT and no RT what is insufficient
|
|
for proper connectivity between network A and B
|
|
10. Check that server 1 cannot ping server 2
|
|
"""
|
|
self._create_networks_and_subnets()
|
|
self._create_l3_bgpvpn(rts=[self.RT1], import_rts=[], export_rts=[])
|
|
self._create_servers()
|
|
self._associate_all_nets_to_bgpvpn()
|
|
self._associate_fip_and_check_l3_bgpvpn()
|
|
self._update_l3_bgpvpn(rts=[], import_rts=[self.RT1],
|
|
export_rts=[self.RT2])
|
|
self._check_l3_bgpvpn(should_succeed=False)
|
|
|
|
@decorators.idempotent_id('fb37a546-7263-4ffe-a42c-77eca377ff1a')
|
|
@utils.services('compute', 'network')
|
|
def test_bgpvpn_negative_update_to_empty_rt_list(self):
|
|
"""This test checks basic BGPVPN route targets update.
|
|
|
|
1. Create networks A and B with their respective subnets
|
|
2. Create L3 BGPVPN with only RT defined
|
|
3. Start up server 1 in network A
|
|
4. Start up server 2 in network B
|
|
5. Associate network A and B to a given L3 BGPVPN
|
|
6. Create router and connect it to network A
|
|
7. Give a FIP to server 1
|
|
8. Check that server 1 can ping server 2
|
|
9. Update L3 BGPVPN to empty RT list what is insufficient
|
|
for proper connectivity between network A and B
|
|
10. Check that server 1 cannot ping server 2
|
|
"""
|
|
self._create_networks_and_subnets()
|
|
self._create_l3_bgpvpn(rts=[self.RT1], import_rts=[], export_rts=[])
|
|
self._create_servers()
|
|
self._associate_all_nets_to_bgpvpn()
|
|
self._associate_fip_and_check_l3_bgpvpn()
|
|
self._update_l3_bgpvpn(rts=[], import_rts=[], export_rts=[])
|
|
self._check_l3_bgpvpn(should_succeed=False)
|
|
|
|
def _create_security_group_for_test(self):
|
|
self.security_group = self.create_security_group(
|
|
project_id=self.bgpvpn_admin_client.project_id,
|
|
security_groups_client=self.admin_security_group_client,
|
|
security_group_rules_client=self.admin_security_group_rule_client)
|
|
|
|
def _create_networks_and_subnets(self, names=None, subnet_cidrs=None,
|
|
port_security=True):
|
|
if not names:
|
|
names = [NET_A, NET_B, NET_C]
|
|
if not subnet_cidrs:
|
|
subnet_cidrs = [[NET_A_S1], [NET_B_S1], [NET_C_S1]]
|
|
for (name, subnet_cidrs) in zip(names, subnet_cidrs):
|
|
network = super(manager.NetworkScenarioTest,
|
|
self).create_network(namestart=name,
|
|
port_security_enabled=port_security,
|
|
networks_client=self.admin_networks_client)
|
|
self.networks[name] = network
|
|
self.subnets[name] = []
|
|
for (j, cidr) in enumerate(subnet_cidrs):
|
|
sub_name = "subnet-%s-%d" % (name, j + 1)
|
|
subnet = self._create_subnet_with_cidr(
|
|
network, namestart=sub_name, cidr=cidr, ip_version=4,
|
|
subnets_client=self.admin_subnets_client)
|
|
self.subnets[name].append(subnet)
|
|
|
|
def _create_subnet_with_cidr(self, network, subnets_client=None,
|
|
namestart='subnet-smoke', **kwargs):
|
|
if not subnets_client:
|
|
subnets_client = self.subnets_client
|
|
tenant_cidr = kwargs.get('cidr')
|
|
subnet = dict(
|
|
name=data_utils.rand_name(namestart),
|
|
network_id=network['id'],
|
|
tenant_id=network['tenant_id'],
|
|
**kwargs)
|
|
result = subnets_client.create_subnet(**subnet)
|
|
self.assertIsNotNone(result, 'Unable to allocate tenant network')
|
|
subnet = result['subnet']
|
|
self.assertEqual(subnet['cidr'], tenant_cidr)
|
|
self.addCleanup(test_utils.call_and_ignore_notfound_exc,
|
|
subnets_client.delete_subnet, subnet['id'])
|
|
return subnet
|
|
|
|
def _create_fip_router(self, client=None, public_network_id=None,
|
|
subnet_id=None):
|
|
if not client:
|
|
client = self.admin_routers_client
|
|
router = self._create_router(client, namestart='router-')
|
|
router_id = router['id']
|
|
if public_network_id is None:
|
|
public_network_id = CONF.network.public_network_id
|
|
if client is None:
|
|
client = self.routers_client
|
|
kwargs = {'external_gateway_info': {'network_id': public_network_id}}
|
|
router = client.update_router(router_id, **kwargs)['router']
|
|
if subnet_id is not None:
|
|
client.add_router_interface(router_id, subnet_id=subnet_id)
|
|
self.addCleanup(test_utils.call_and_ignore_notfound_exc,
|
|
client.remove_router_interface, router_id,
|
|
subnet_id=subnet_id)
|
|
return router
|
|
|
|
def _associate_fip(self, server_index):
|
|
server = self.servers[server_index]
|
|
fip = self.create_floating_ip(
|
|
server, external_network_id=CONF.network.public_network_id,
|
|
port_id=self.ports[server['id']]['id'],
|
|
client=self.admin_fips_client)
|
|
self.server_fips[server['id']] = fip
|
|
return fip
|
|
|
|
def _create_router_and_associate_fip(self, server_index, subnet):
|
|
router = self._create_fip_router(client=self.admin_routers_client,
|
|
subnet_id=subnet['id'])
|
|
self._associate_fip(server_index)
|
|
return router
|
|
|
|
def _create_server(self, name, keypair, network, ip_address,
|
|
security_group_ids, clients, port_security):
|
|
security_groups = []
|
|
if port_security:
|
|
security_groups = security_group_ids
|
|
create_port_body = {'fixed_ips': [{'ip_address': ip_address}],
|
|
'namestart': 'port-smoke',
|
|
'security_groups': security_groups}
|
|
|
|
port = super(manager.NetworkScenarioTest,
|
|
self).create_port(network_id=network['id'],
|
|
client=self.admin_ports_client,
|
|
**create_port_body)
|
|
|
|
create_server_kwargs = {
|
|
'key_name': keypair['name'],
|
|
'networks': [{'uuid': network['id'], 'port': port['id']}]
|
|
}
|
|
body, servers = compute.create_test_server(
|
|
clients, wait_until='ACTIVE', name=name, **create_server_kwargs)
|
|
self.addCleanup(waiters.wait_for_server_termination,
|
|
clients.servers_client, body['id'])
|
|
self.addCleanup(test_utils.call_and_ignore_notfound_exc,
|
|
clients.servers_client.delete_server, body['id'])
|
|
server = clients.servers_client.show_server(body['id'])['server']
|
|
LOG.debug('Created server: %s with status: %s', server['id'],
|
|
server['status'])
|
|
self.ports[server['id']] = port
|
|
return server
|
|
|
|
def _create_servers(self, ports_config=None, port_security=True):
|
|
keypair = self.create_keypair(client=self.admin_keys_client)
|
|
security_group_ids = [self.security_group['id']]
|
|
if ports_config is None:
|
|
ports_config = [[self.networks[NET_A], IP_A_S1_1],
|
|
[self.networks[NET_B], IP_B_S1_1]]
|
|
for (i, port_config) in enumerate(ports_config):
|
|
network = port_config[0]
|
|
server = self._create_server(
|
|
'server-' + str(i + 1), keypair, network, port_config[1],
|
|
security_group_ids, self.os_admin, port_security)
|
|
self.servers.append(server)
|
|
self.servers_keypairs[server['id']] = keypair
|
|
self.server_fixed_ips[server['id']] = (
|
|
server['addresses'][network['name']][0]['addr'])
|
|
self.assertTrue(self.servers_keypairs)
|
|
|
|
def _create_l3_bgpvpn(self, name='test-l3-bgpvpn', rts=None,
|
|
import_rts=None, export_rts=None):
|
|
if rts is None and import_rts is None and export_rts is None:
|
|
rts = [self.RT1]
|
|
import_rts = import_rts or []
|
|
export_rts = export_rts or []
|
|
self.bgpvpn = self.create_bgpvpn(
|
|
self.bgpvpn_admin_client,
|
|
tenant_id=self.bgpvpn_admin_client.project_id,
|
|
name=name, route_targets=rts, export_targets=export_rts,
|
|
import_targets=import_rts)
|
|
return self.bgpvpn
|
|
|
|
def _update_l3_bgpvpn(self, rts=None, import_rts=None, export_rts=None,
|
|
bgpvpn=None):
|
|
bgpvpn = bgpvpn or self.bgpvpn
|
|
if rts is None:
|
|
rts = [self.RT1]
|
|
import_rts = import_rts or []
|
|
export_rts = export_rts or []
|
|
LOG.debug('Updating targets in BGPVPN %s', bgpvpn['id'])
|
|
self.bgpvpn_admin_client.update_bgpvpn(bgpvpn['id'],
|
|
route_targets=rts,
|
|
export_targets=export_rts,
|
|
import_targets=import_rts)
|
|
|
|
def _associate_all_nets_to_bgpvpn(self, bgpvpn=None):
|
|
bgpvpn = bgpvpn or self.bgpvpn
|
|
for network in self.networks.values():
|
|
self.bgpvpn_admin_client.create_network_association(
|
|
bgpvpn['id'], network['id'])
|
|
LOG.debug('BGPVPN network associations completed')
|
|
|
|
def _setup_ssh_client(self, server):
|
|
server_fip = self.server_fips[server['id']][
|
|
'floating_ip_address']
|
|
private_key = self.servers_keypairs[server['id']][
|
|
'private_key']
|
|
ssh_client = self.get_remote_client(server_fip,
|
|
private_key=private_key,
|
|
server=server)
|
|
return ssh_client
|
|
|
|
def _setup_http_server(self, server_index):
|
|
server = self.servers[server_index]
|
|
ssh_client = self._setup_ssh_client(server)
|
|
ssh_client.exec_command("sudo nc -kl -p 80 -e echo '%s:%s' &"
|
|
% (server['name'], server['id']))
|
|
|
|
def _setup_ip_forwarding(self, server_index):
|
|
server = self.servers[server_index]
|
|
ssh_client = self._setup_ssh_client(server)
|
|
ssh_client.exec_command("sudo sysctl -w net.ipv4.ip_forward=1")
|
|
|
|
def _setup_ip_address(self, server_index, cidr, device=None):
|
|
self._setup_range_ip_address(server_index, [cidr], device=None)
|
|
|
|
def _setup_range_ip_address(self, server_index, cidrs, device=None):
|
|
MAX_CIDRS = 50
|
|
if device is None:
|
|
device = 'lo'
|
|
server = self.servers[server_index]
|
|
ssh_client = self._setup_ssh_client(server)
|
|
for i in range(0, len(cidrs), MAX_CIDRS):
|
|
ips = ' '.join(cidrs[i:i + MAX_CIDRS])
|
|
ssh_client.exec_command(
|
|
("for ip in {ips}; do sudo ip addr add $ip "
|
|
"dev {dev}; done").format(ips=ips, dev=device))
|
|
|
|
def _check_l3_bgpvpn(self, from_server=None, to_server=None,
|
|
should_succeed=True, validate_server=False):
|
|
to_server = to_server or self.servers[1]
|
|
destination_srv = None
|
|
if validate_server:
|
|
destination_srv = '%s:%s' % (to_server['name'], to_server['id'])
|
|
destination_ip = self.server_fixed_ips[to_server['id']]
|
|
self._check_l3_bgpvpn_by_specific_ip(from_server=from_server,
|
|
to_server_ip=destination_ip,
|
|
should_succeed=should_succeed,
|
|
validate_server=destination_srv)
|
|
|
|
def _check_l3_bgpvpn_by_specific_ip(self, from_server=None,
|
|
to_server_ip=None,
|
|
should_succeed=True,
|
|
validate_server=None,
|
|
repeat_validate_server=10):
|
|
from_server = from_server or self.servers[0]
|
|
from_server_ip = self.server_fips[from_server['id']][
|
|
'floating_ip_address']
|
|
if to_server_ip is None:
|
|
to_server_ip = self.server_fixed_ips[self.servers[1]['id']]
|
|
ssh_client = self._setup_ssh_client(from_server)
|
|
check_reachable = should_succeed or validate_server
|
|
msg = ""
|
|
if check_reachable:
|
|
msg = "Timed out waiting for {ip} to become reachable".format(
|
|
ip=to_server_ip)
|
|
else:
|
|
msg = ("Unexpected ping response from VM with IP address "
|
|
"{dest} originated from VM with IP address "
|
|
"{src}").format(dest=to_server_ip, src=from_server_ip)
|
|
try:
|
|
result = self._check_remote_connectivity(ssh_client,
|
|
to_server_ip,
|
|
check_reachable)
|
|
# if a negative connectivity check was unsuccessful (unexpected
|
|
# ping reply) then try to know more:
|
|
if not check_reachable and not result:
|
|
try:
|
|
content = ssh_client.exec_command(
|
|
"nc %s 80" % to_server_ip).strip()
|
|
LOG.warning("Can connect to %s: %s", to_server_ip, content)
|
|
except Exception:
|
|
LOG.warning("Could ping %s, but no http", to_server_ip)
|
|
|
|
self.assertTrue(result, msg)
|
|
|
|
if validate_server and result:
|
|
# repeating multiple times gives increased odds of avoiding
|
|
# false positives in the case where the dataplane does
|
|
# equal-cost multipath
|
|
for i in range(0, repeat_validate_server):
|
|
real_dest = ssh_client.exec_command(
|
|
"nc %s 80" % to_server_ip).strip()
|
|
result = real_dest == validate_server
|
|
self.assertTrue(
|
|
should_succeed == result,
|
|
("Destination server name is '%s', expected is '%s'" %
|
|
(real_dest, validate_server)))
|
|
LOG.info("nc server name check %d successful", i)
|
|
except Exception:
|
|
LOG.exception("Error validating connectivity to %s "
|
|
"from VM with IP address %s: %s",
|
|
to_server_ip, from_server_ip, msg)
|
|
raise
|
|
|
|
def _associate_fip_and_check_l3_bgpvpn(self, should_succeed=True):
|
|
subnet = self.subnets[NET_A][0]
|
|
self.router = self._create_router_and_associate_fip(0, subnet)
|
|
self._check_l3_bgpvpn(should_succeed=should_succeed)
|
|
|
|
def _delete_router(self, router, routers_client=None, ports_client=None):
|
|
if not routers_client:
|
|
routers_client = self.routers_client
|
|
if not ports_client:
|
|
ports_client = self.ports_client
|
|
ports_rsp = ports_client.list_ports(device_id=router['id'])
|
|
interfaces = ports_rsp['ports']
|
|
for i in interfaces:
|
|
test_utils.call_and_ignore_notfound_exc(
|
|
routers_client.remove_router_interface, router['id'],
|
|
subnet_id=i['fixed_ips'][0]['subnet_id'])
|
|
routers_client.delete_router(router['id'])
|