blob: b687aa08b0a05aa547aedfe5d2dbb8750cd421a5 [file] [log] [blame]
Kirill Shileev14113572014-11-21 16:58:02 +03001# Copyright 2014 Cisco Systems, Inc.
2# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
Henry Gessau0efcfb92015-02-27 15:24:39 -050015import functools
Doug Hellmann583ce2c2015-03-11 14:55:46 +000016
Andrea Frittolicd368412017-08-14 21:37:56 +010017from tempest.common import utils
Kirill Shileev14113572014-11-21 16:58:02 +030018from tempest import config
Steve Heyman33735f22016-05-24 09:28:08 -050019from tempest.lib.common.utils import test_utils
Ken'ichi Ohmichic85a9512017-01-27 18:34:24 -080020from tempest.lib import decorators
Kirill Shileev14113572014-11-21 16:58:02 +030021from tempest.scenario import manager
Kirill Shileev14113572014-11-21 16:58:02 +030022
Kirill Shileev14113572014-11-21 16:58:02 +030023CONF = config.CONF
Kirill Shileev14113572014-11-21 16:58:02 +030024
25
26class TestGettingAddress(manager.NetworkScenarioTest):
Yair Friede198e2f2015-07-28 14:43:47 +030027 """Test Summary:
28
29 1. Create network with subnets:
30 1.1. one IPv4 and
31 1.2. one or more IPv6 in a given address mode
32 2. Boot 2 VMs on this network
33 3. Allocate and assign 2 FIP4
34 4. Check that vNICs of all VMs gets all addresses actually assigned
35 5. Each VM will ping the other's v4 private address
36 6. If ping6 available in VM, each VM will ping all of the other's v6
37 addresses as well as the router's
Kirill Shileev14113572014-11-21 16:58:02 +030038 """
39
40 @classmethod
Emily Hugenbruch5e2d2a22015-02-25 21:35:45 +000041 def skip_checks(cls):
42 super(TestGettingAddress, cls).skip_checks()
Kirill Shileev14113572014-11-21 16:58:02 +030043 if not (CONF.network_feature_enabled.ipv6
44 and CONF.network_feature_enabled.ipv6_subnet_attributes):
Kirill Shileev14113572014-11-21 16:58:02 +030045 raise cls.skipException('IPv6 or its attributes not supported')
Sean Dagueed6e5862016-04-04 10:49:13 -040046 if not (CONF.network.project_networks_reachable
Kirill Shileev14113572014-11-21 16:58:02 +030047 or CONF.network.public_network_id):
Sean Dagueed6e5862016-04-04 10:49:13 -040048 msg = ('Either project_networks_reachable must be "true", or '
Kirill Shileev14113572014-11-21 16:58:02 +030049 'public_network_id must be defined.')
Kirill Shileev14113572014-11-21 16:58:02 +030050 raise cls.skipException(msg)
ghanshyam929b3482016-12-05 11:47:53 +090051 if CONF.network.shared_physical_network:
Thiago Paiva66cded22016-08-15 14:55:58 -030052 msg = 'Deployment uses a shared physical network'
Adam Gandelmanab6106d2014-12-12 10:38:23 -080053 raise cls.skipException(msg)
Matthew Treinish3312de32017-05-19 12:08:17 -040054 if not CONF.network_feature_enabled.floating_ips:
55 raise cls.skipException("Floating ips are not available")
Adam Gandelman721f80d2014-12-12 11:03:14 -080056
Emily Hugenbruch5e2d2a22015-02-25 21:35:45 +000057 @classmethod
58 def setup_credentials(cls):
59 # Create no network resources for these tests.
60 cls.set_network_resources()
61 super(TestGettingAddress, cls).setup_credentials()
Kirill Shileev14113572014-11-21 16:58:02 +030062
63 def setUp(self):
64 super(TestGettingAddress, self).setUp()
65 self.keypair = self.create_keypair()
Marc Koderer410c7822016-11-08 11:47:00 +010066 self.sec_grp = self._create_security_group()
Kirill Shileev14113572014-11-21 16:58:02 +030067
Daniel Mellado9e3e1062015-08-06 18:07:05 +020068 def prepare_network(self, address6_mode, n_subnets6=1, dualnet=False):
Ken'ichi Ohmichic4e4f1c2015-11-17 08:16:12 +000069 """Prepare network
70
71 Creates network with given number of IPv6 subnets in the given mode and
72 one IPv4 subnet.
73 Creates router with ports on all subnets.
74 if dualnet - create IPv6 subnets on a different network
75 :return: list of created networks
Kirill Shileev14113572014-11-21 16:58:02 +030076 """
Jordan Pittier37b94a02017-02-21 18:11:55 +010077 network = self._create_network()
Daniel Mellado9e3e1062015-08-06 18:07:05 +020078 if dualnet:
Jordan Pittier37b94a02017-02-21 18:11:55 +010079 network_v6 = self._create_network()
Daniel Mellado9e3e1062015-08-06 18:07:05 +020080
Jordan Pittier37b94a02017-02-21 18:11:55 +010081 sub4 = self._create_subnet(network=network,
Kirill Shileev14113572014-11-21 16:58:02 +030082 namestart='sub4',
Yair Friede198e2f2015-07-28 14:43:47 +030083 ip_version=4)
Kirill Shileev14113572014-11-21 16:58:02 +030084
Marc Koderer410c7822016-11-08 11:47:00 +010085 router = self._get_router()
Steve Heyman33735f22016-05-24 09:28:08 -050086 self.routers_client.add_router_interface(router['id'],
87 subnet_id=sub4['id'])
88
89 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
90 self.routers_client.remove_router_interface,
91 router['id'], subnet_id=sub4['id'])
Kirill Shileevb1f97522015-02-19 20:39:05 +030092
Yair Friede198e2f2015-07-28 14:43:47 +030093 self.subnets_v6 = []
Kirill Shileevb1f97522015-02-19 20:39:05 +030094 for _ in range(n_subnets6):
Jordan Pittier37b94a02017-02-21 18:11:55 +010095 net6 = network_v6 if dualnet else network
Daniel Mellado9e3e1062015-08-06 18:07:05 +020096 sub6 = self._create_subnet(network=net6,
Kirill Shileevb1f97522015-02-19 20:39:05 +030097 namestart='sub6',
98 ip_version=6,
99 ipv6_ra_mode=address6_mode,
100 ipv6_address_mode=address6_mode)
101
Steve Heyman33735f22016-05-24 09:28:08 -0500102 self.routers_client.add_router_interface(router['id'],
103 subnet_id=sub6['id'])
Kirill Shileev14113572014-11-21 16:58:02 +0300104
Steve Heyman33735f22016-05-24 09:28:08 -0500105 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
106 self.routers_client.remove_router_interface,
107 router['id'], subnet_id=sub6['id'])
108
109 self.subnets_v6.append(sub6)
Jordan Pittier37b94a02017-02-21 18:11:55 +0100110 return [network, network_v6] if dualnet else [network]
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200111
Kirill Shileev14113572014-11-21 16:58:02 +0300112 @staticmethod
113 def define_server_ips(srv):
Kirill Shileevb1f97522015-02-19 20:39:05 +0300114 ips = {'4': None, '6': []}
Béla Vancsicsb6dfa082017-03-01 10:44:58 +0100115 for nics in srv['addresses'].values():
Kirill Shileev14113572014-11-21 16:58:02 +0300116 for nic in nics:
117 if nic['version'] == 6:
Kirill Shileevb1f97522015-02-19 20:39:05 +0300118 ips['6'].append(nic['addr'])
Kirill Shileev14113572014-11-21 16:58:02 +0300119 else:
Kirill Shileevb1f97522015-02-19 20:39:05 +0300120 ips['4'] = nic['addr']
121 return ips
Kirill Shileev14113572014-11-21 16:58:02 +0300122
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200123 def prepare_server(self, networks=None):
lanoux283273b2015-12-04 03:01:54 -0800124 username = CONF.validation.image_ssh_user
Kirill Shileev14113572014-11-21 16:58:02 +0300125
lanoux5fc14522015-09-21 08:17:35 +0000126 srv = self.create_server(
127 key_name=self.keypair['name'],
128 security_groups=[{'name': self.sec_grp['name']}],
zhufl13c9c892017-02-10 12:04:07 +0800129 networks=[{'uuid': n['id']} for n in networks])
Kirill Shileev14113572014-11-21 16:58:02 +0300130 fip = self.create_floating_ip(thing=srv)
Kirill Shileevb1f97522015-02-19 20:39:05 +0300131 ips = self.define_server_ips(srv=srv)
Kirill Shileev14113572014-11-21 16:58:02 +0300132 ssh = self.get_remote_client(
Steve Heyman33735f22016-05-24 09:28:08 -0500133 ip_address=fip['floating_ip_address'],
zhuflf52c7592017-05-25 13:55:24 +0800134 username=username, server=srv)
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200135 return ssh, ips, srv["id"]
Kirill Shileev14113572014-11-21 16:58:02 +0300136
Jordan Pittier37b94a02017-02-21 18:11:55 +0100137 def turn_nic6_on(self, ssh, sid, network_id):
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200138 """Turns the IPv6 vNIC on
Kirill Shileev14113572014-11-21 16:58:02 +0300139
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200140 Required because guest images usually set only the first vNIC on boot.
141 Searches for the IPv6 vNIC's MAC and brings it up.
142
143 @param ssh: RemoteClient ssh instance to server
144 @param sid: server uuid
Jordan Pittier37b94a02017-02-21 18:11:55 +0100145 @param network_id: the network id the NIC is connected to
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200146 """
Jordan Pittier64e6b442017-02-20 19:29:02 +0100147 ports = [
148 p["mac_address"] for p in
jeremy.zhang5870ff12017-05-25 11:24:23 +0800149 self.os_admin.ports_client.list_ports(
Jordan Pittier37b94a02017-02-21 18:11:55 +0100150 device_id=sid, network_id=network_id)['ports']
Jordan Pittier64e6b442017-02-20 19:29:02 +0100151 ]
Jordan Pittier37b94a02017-02-21 18:11:55 +0100152
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200153 self.assertEqual(1, len(ports),
Ken'ichi Ohmichi695ac5c2015-10-13 03:07:17 +0000154 message=("Multiple IPv6 ports found on network %s. "
155 "ports: %s")
Jordan Pittier37b94a02017-02-21 18:11:55 +0100156 % (network_id, ports))
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200157 mac6 = ports[0]
Ken'ichi Ohmichi126fe982017-03-17 10:41:44 -0700158 nic = ssh.get_nic_name_by_mac(mac6)
159 ssh.exec_command("sudo ip link set %s up" % nic)
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200160
161 def _prepare_and_test(self, address6_mode, n_subnets6=1, dualnet=False):
162 net_list = self.prepare_network(address6_mode=address6_mode,
163 n_subnets6=n_subnets6,
164 dualnet=dualnet)
165
166 sshv4_1, ips_from_api_1, sid1 = self.prepare_server(networks=net_list)
167 sshv4_2, ips_from_api_2, sid2 = self.prepare_server(networks=net_list)
Kirill Shileev14113572014-11-21 16:58:02 +0300168
Henry Gessau0efcfb92015-02-27 15:24:39 -0500169 def guest_has_address(ssh, addr):
Ken'ichi Ohmichi84aeba62017-03-01 18:31:20 -0800170 return addr in ssh.exec_command("ip address")
Henry Gessau0efcfb92015-02-27 15:24:39 -0500171
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200172 # Turn on 2nd NIC for Cirros when dualnet
173 if dualnet:
Ferenc Horváthbce1fcf2017-06-07 11:19:51 +0200174 _, network_v6 = net_list
Jordan Pittier37b94a02017-02-21 18:11:55 +0100175 self.turn_nic6_on(sshv4_1, sid1, network_v6['id'])
176 self.turn_nic6_on(sshv4_2, sid2, network_v6['id'])
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200177
Kirill Shileevb1f97522015-02-19 20:39:05 +0300178 # get addresses assigned to vNIC as reported by 'ip address' utility
Ken'ichi Ohmichi84aeba62017-03-01 18:31:20 -0800179 ips_from_ip_1 = sshv4_1.exec_command("ip address")
180 ips_from_ip_2 = sshv4_2.exec_command("ip address")
Kirill Shileevb1f97522015-02-19 20:39:05 +0300181 self.assertIn(ips_from_api_1['4'], ips_from_ip_1)
182 self.assertIn(ips_from_api_2['4'], ips_from_ip_2)
183 for i in range(n_subnets6):
184 # v6 should be configured since the image supports it
185 # It can take time for ipv6 automatic address to get assigned
186 srv1_v6_addr_assigned = functools.partial(
187 guest_has_address, sshv4_1, ips_from_api_1['6'][i])
Henry Gessau0efcfb92015-02-27 15:24:39 -0500188
Kirill Shileevb1f97522015-02-19 20:39:05 +0300189 srv2_v6_addr_assigned = functools.partial(
190 guest_has_address, sshv4_2, ips_from_api_2['6'][i])
191
Jordan Pittier35a63752016-08-30 13:09:12 +0200192 self.assertTrue(test_utils.call_until_true(srv1_v6_addr_assigned,
lanoux5fc14522015-09-21 08:17:35 +0000193 CONF.validation.ping_timeout, 1))
Kirill Shileevb1f97522015-02-19 20:39:05 +0300194
Jordan Pittier35a63752016-08-30 13:09:12 +0200195 self.assertTrue(test_utils.call_until_true(srv2_v6_addr_assigned,
lanoux5fc14522015-09-21 08:17:35 +0000196 CONF.validation.ping_timeout, 1))
Kirill Shileevb1f97522015-02-19 20:39:05 +0300197
YAMAMOTO Takashi4c3ebb02017-01-25 16:04:30 +0900198 self.check_remote_connectivity(sshv4_1, ips_from_api_2['4'])
199 self.check_remote_connectivity(sshv4_2, ips_from_api_1['4'])
Kirill Shileev14113572014-11-21 16:58:02 +0300200
Sean M. Collinsc0378482015-10-26 12:59:47 +0900201 for i in range(n_subnets6):
YAMAMOTO Takashi4c3ebb02017-01-25 16:04:30 +0900202 self.check_remote_connectivity(sshv4_1,
203 ips_from_api_2['6'][i])
204 self.check_remote_connectivity(sshv4_1,
205 self.subnets_v6[i]['gateway_ip'])
206 self.check_remote_connectivity(sshv4_2,
207 ips_from_api_1['6'][i])
208 self.check_remote_connectivity(sshv4_2,
209 self.subnets_v6[i]['gateway_ip'])
Yair Friede198e2f2015-07-28 14:43:47 +0300210
Jordan Pittier3b46d272017-04-12 16:17:28 +0200211 @decorators.attr(type='slow')
Ken'ichi Ohmichic85a9512017-01-27 18:34:24 -0800212 @decorators.idempotent_id('2c92df61-29f0-4eaa-bee3-7c65bef62a43')
Andrea Frittolicd368412017-08-14 21:37:56 +0100213 @utils.services('compute', 'network')
Kirill Shileev14113572014-11-21 16:58:02 +0300214 def test_slaac_from_os(self):
215 self._prepare_and_test(address6_mode='slaac')
216
Jordan Pittier3b46d272017-04-12 16:17:28 +0200217 @decorators.attr(type='slow')
Ken'ichi Ohmichic85a9512017-01-27 18:34:24 -0800218 @decorators.idempotent_id('d7e1f858-187c-45a6-89c9-bdafde619a9f')
Andrea Frittolicd368412017-08-14 21:37:56 +0100219 @utils.services('compute', 'network')
Kirill Shileev14113572014-11-21 16:58:02 +0300220 def test_dhcp6_stateless_from_os(self):
221 self._prepare_and_test(address6_mode='dhcpv6-stateless')
Kirill Shileevb1f97522015-02-19 20:39:05 +0300222
Jordan Pittier3b46d272017-04-12 16:17:28 +0200223 @decorators.attr(type='slow')
Ken'ichi Ohmichic85a9512017-01-27 18:34:24 -0800224 @decorators.idempotent_id('7ab23f41-833b-4a16-a7c9-5b42fe6d4123')
Andrea Frittolicd368412017-08-14 21:37:56 +0100225 @utils.services('compute', 'network')
Kirill Shileevb1f97522015-02-19 20:39:05 +0300226 def test_multi_prefix_dhcpv6_stateless(self):
227 self._prepare_and_test(address6_mode='dhcpv6-stateless', n_subnets6=2)
228
Jordan Pittier3b46d272017-04-12 16:17:28 +0200229 @decorators.attr(type='slow')
Ken'ichi Ohmichic85a9512017-01-27 18:34:24 -0800230 @decorators.idempotent_id('dec222b1-180c-4098-b8c5-cc1b8342d611')
Andrea Frittolicd368412017-08-14 21:37:56 +0100231 @utils.services('compute', 'network')
Kirill Shileevb1f97522015-02-19 20:39:05 +0300232 def test_multi_prefix_slaac(self):
233 self._prepare_and_test(address6_mode='slaac', n_subnets6=2)
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200234
Jordan Pittier3b46d272017-04-12 16:17:28 +0200235 @decorators.attr(type='slow')
Ken'ichi Ohmichic85a9512017-01-27 18:34:24 -0800236 @decorators.idempotent_id('b6399d76-4438-4658-bcf5-0d6c8584fde2')
Andrea Frittolicd368412017-08-14 21:37:56 +0100237 @utils.services('compute', 'network')
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200238 def test_dualnet_slaac_from_os(self):
239 self._prepare_and_test(address6_mode='slaac', dualnet=True)
240
Jordan Pittier3b46d272017-04-12 16:17:28 +0200241 @decorators.attr(type='slow')
Ken'ichi Ohmichic85a9512017-01-27 18:34:24 -0800242 @decorators.idempotent_id('76f26acd-9688-42b4-bc3e-cd134c4cb09e')
Andrea Frittolicd368412017-08-14 21:37:56 +0100243 @utils.services('compute', 'network')
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200244 def test_dualnet_dhcp6_stateless_from_os(self):
245 self._prepare_and_test(address6_mode='dhcpv6-stateless', dualnet=True)
246
Jordan Pittier3b46d272017-04-12 16:17:28 +0200247 @decorators.attr(type='slow')
Ken'ichi Ohmichic85a9512017-01-27 18:34:24 -0800248 @decorators.idempotent_id('cf1c4425-766b-45b8-be35-e2959728eb00')
Andrea Frittolicd368412017-08-14 21:37:56 +0100249 @utils.services('compute', 'network')
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200250 def test_dualnet_multi_prefix_dhcpv6_stateless(self):
251 self._prepare_and_test(address6_mode='dhcpv6-stateless', n_subnets6=2,
252 dualnet=True)
253
Ken'ichi Ohmichic85a9512017-01-27 18:34:24 -0800254 @decorators.idempotent_id('9178ad42-10e4-47e9-8987-e02b170cc5cd')
Andrea Frittolicd368412017-08-14 21:37:56 +0100255 @utils.services('compute', 'network')
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200256 def test_dualnet_multi_prefix_slaac(self):
257 self._prepare_and_test(address6_mode='slaac', n_subnets6=2,
258 dualnet=True)