blob: a9394cb7e5a3fa0dc49c5b0393c842bab48fa2d0 [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
17from oslo_log import log as logging
Matthew Treinish71426682015-04-23 11:19:38 -040018import six
Doug Hellmann583ce2c2015-03-11 14:55:46 +000019
Kirill Shileev14113572014-11-21 16:58:02 +030020from tempest import config
Kirill Shileev14113572014-11-21 16:58:02 +030021from tempest.scenario import manager
22from tempest import test
23
24
25CONF = config.CONF
26LOG = logging.getLogger(__name__)
27
28
29class TestGettingAddress(manager.NetworkScenarioTest):
Yair Friede198e2f2015-07-28 14:43:47 +030030 """Test Summary:
31
32 1. Create network with subnets:
33 1.1. one IPv4 and
34 1.2. one or more IPv6 in a given address mode
35 2. Boot 2 VMs on this network
36 3. Allocate and assign 2 FIP4
37 4. Check that vNICs of all VMs gets all addresses actually assigned
38 5. Each VM will ping the other's v4 private address
39 6. If ping6 available in VM, each VM will ping all of the other's v6
40 addresses as well as the router's
Kirill Shileev14113572014-11-21 16:58:02 +030041 """
42
43 @classmethod
Emily Hugenbruch5e2d2a22015-02-25 21:35:45 +000044 def skip_checks(cls):
45 super(TestGettingAddress, cls).skip_checks()
Kirill Shileev14113572014-11-21 16:58:02 +030046 if not (CONF.network_feature_enabled.ipv6
47 and CONF.network_feature_enabled.ipv6_subnet_attributes):
Kirill Shileev14113572014-11-21 16:58:02 +030048 raise cls.skipException('IPv6 or its attributes not supported')
49 if not (CONF.network.tenant_networks_reachable
50 or CONF.network.public_network_id):
51 msg = ('Either tenant_networks_reachable must be "true", or '
52 'public_network_id must be defined.')
Kirill Shileev14113572014-11-21 16:58:02 +030053 raise cls.skipException(msg)
Adam Gandelmanab6106d2014-12-12 10:38:23 -080054 if CONF.baremetal.driver_enabled:
55 msg = ('Baremetal does not currently support network isolation')
56 raise cls.skipException(msg)
Adam Gandelman721f80d2014-12-12 11:03:14 -080057
Emily Hugenbruch5e2d2a22015-02-25 21:35:45 +000058 @classmethod
59 def setup_credentials(cls):
60 # Create no network resources for these tests.
61 cls.set_network_resources()
62 super(TestGettingAddress, cls).setup_credentials()
Kirill Shileev14113572014-11-21 16:58:02 +030063
64 def setUp(self):
65 super(TestGettingAddress, self).setUp()
66 self.keypair = self.create_keypair()
67 self.sec_grp = self._create_security_group(tenant_id=self.tenant_id)
68 self.srv_kwargs = {
69 'key_name': self.keypair['name'],
ghanshyamfc5e0c72015-01-29 15:09:40 +090070 'security_groups': [{'name': self.sec_grp['name']}]}
Kirill Shileev14113572014-11-21 16:58:02 +030071
Daniel Mellado9e3e1062015-08-06 18:07:05 +020072 def prepare_network(self, address6_mode, n_subnets6=1, dualnet=False):
Kirill Shileev14113572014-11-21 16:58:02 +030073 """Creates network with
Kirill Shileevb1f97522015-02-19 20:39:05 +030074 given number of IPv6 subnets in the given mode and
Kirill Shileev14113572014-11-21 16:58:02 +030075 one IPv4 subnet
Kirill Shileevb1f97522015-02-19 20:39:05 +030076 Creates router with ports on all subnets
Daniel Mellado9e3e1062015-08-06 18:07:05 +020077 if dualnet - create IPv6 subnets on a different network
78 :return: list of created networks
Kirill Shileev14113572014-11-21 16:58:02 +030079 """
Matthew Treinish8e48ad62014-12-12 11:07:23 -050080 self.network = self._create_network(tenant_id=self.tenant_id)
Daniel Mellado9e3e1062015-08-06 18:07:05 +020081 if dualnet:
82 self.network_v6 = self._create_network(tenant_id=self.tenant_id)
83
Matthew Treinish8e48ad62014-12-12 11:07:23 -050084 sub4 = self._create_subnet(network=self.network,
Kirill Shileev14113572014-11-21 16:58:02 +030085 namestart='sub4',
Yair Friede198e2f2015-07-28 14:43:47 +030086 ip_version=4)
Kirill Shileev14113572014-11-21 16:58:02 +030087
88 router = self._get_router(tenant_id=self.tenant_id)
89 sub4.add_to_router(router_id=router['id'])
Kirill Shileev14113572014-11-21 16:58:02 +030090 self.addCleanup(sub4.delete)
Kirill Shileevb1f97522015-02-19 20:39:05 +030091
Yair Friede198e2f2015-07-28 14:43:47 +030092 self.subnets_v6 = []
Kirill Shileevb1f97522015-02-19 20:39:05 +030093 for _ in range(n_subnets6):
Daniel Mellado9e3e1062015-08-06 18:07:05 +020094 net6 = self.network_v6 if dualnet else self.network
95 sub6 = self._create_subnet(network=net6,
Kirill Shileevb1f97522015-02-19 20:39:05 +030096 namestart='sub6',
97 ip_version=6,
98 ipv6_ra_mode=address6_mode,
99 ipv6_address_mode=address6_mode)
100
101 sub6.add_to_router(router_id=router['id'])
102 self.addCleanup(sub6.delete)
Yair Friede198e2f2015-07-28 14:43:47 +0300103 self.subnets_v6.append(sub6)
Kirill Shileev14113572014-11-21 16:58:02 +0300104
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200105 return [self.network, self.network_v6] if dualnet else [self.network]
106
Kirill Shileev14113572014-11-21 16:58:02 +0300107 @staticmethod
108 def define_server_ips(srv):
Kirill Shileevb1f97522015-02-19 20:39:05 +0300109 ips = {'4': None, '6': []}
Matthew Treinish71426682015-04-23 11:19:38 -0400110 for net_name, nics in six.iteritems(srv['addresses']):
Kirill Shileev14113572014-11-21 16:58:02 +0300111 for nic in nics:
112 if nic['version'] == 6:
Kirill Shileevb1f97522015-02-19 20:39:05 +0300113 ips['6'].append(nic['addr'])
Kirill Shileev14113572014-11-21 16:58:02 +0300114 else:
Kirill Shileevb1f97522015-02-19 20:39:05 +0300115 ips['4'] = nic['addr']
116 return ips
Kirill Shileev14113572014-11-21 16:58:02 +0300117
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200118 def prepare_server(self, networks=None):
Kirill Shileev14113572014-11-21 16:58:02 +0300119 username = CONF.compute.image_ssh_user
120
Matthew Treinish8e48ad62014-12-12 11:07:23 -0500121 create_kwargs = self.srv_kwargs
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200122 networks = networks or [self.network]
123 create_kwargs['networks'] = [{'uuid': n.id} for n in networks]
Matthew Treinish8e48ad62014-12-12 11:07:23 -0500124
125 srv = self.create_server(create_kwargs=create_kwargs)
Kirill Shileev14113572014-11-21 16:58:02 +0300126 fip = self.create_floating_ip(thing=srv)
Kirill Shileevb1f97522015-02-19 20:39:05 +0300127 ips = self.define_server_ips(srv=srv)
Kirill Shileev14113572014-11-21 16:58:02 +0300128 ssh = self.get_remote_client(
129 server_or_ip=fip.floating_ip_address,
130 username=username)
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200131 return ssh, ips, srv["id"]
Kirill Shileev14113572014-11-21 16:58:02 +0300132
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200133 def turn_nic6_on(self, ssh, sid):
134 """Turns the IPv6 vNIC on
Kirill Shileev14113572014-11-21 16:58:02 +0300135
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200136 Required because guest images usually set only the first vNIC on boot.
137 Searches for the IPv6 vNIC's MAC and brings it up.
138
139 @param ssh: RemoteClient ssh instance to server
140 @param sid: server uuid
141 """
142 ports = [p["mac_address"] for p in
143 self._list_ports(device_id=sid,
144 network_id=self.network_v6.id)]
145 self.assertEqual(1, len(ports),
146 message="Multiple IPv6 ports found on network %s"
147 % self.network_v6)
148 mac6 = ports[0]
149 ssh.turn_nic_on(ssh.get_nic_name(mac6))
150
151 def _prepare_and_test(self, address6_mode, n_subnets6=1, dualnet=False):
152 net_list = self.prepare_network(address6_mode=address6_mode,
153 n_subnets6=n_subnets6,
154 dualnet=dualnet)
155
156 sshv4_1, ips_from_api_1, sid1 = self.prepare_server(networks=net_list)
157 sshv4_2, ips_from_api_2, sid2 = self.prepare_server(networks=net_list)
Kirill Shileev14113572014-11-21 16:58:02 +0300158
Henry Gessau0efcfb92015-02-27 15:24:39 -0500159 def guest_has_address(ssh, addr):
160 return addr in ssh.get_ip_list()
161
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200162 # Turn on 2nd NIC for Cirros when dualnet
163 if dualnet:
164 self.turn_nic6_on(sshv4_1, sid1)
165 self.turn_nic6_on(sshv4_2, sid2)
166
Kirill Shileevb1f97522015-02-19 20:39:05 +0300167 # get addresses assigned to vNIC as reported by 'ip address' utility
168 ips_from_ip_1 = sshv4_1.get_ip_list()
169 ips_from_ip_2 = sshv4_2.get_ip_list()
170 self.assertIn(ips_from_api_1['4'], ips_from_ip_1)
171 self.assertIn(ips_from_api_2['4'], ips_from_ip_2)
172 for i in range(n_subnets6):
173 # v6 should be configured since the image supports it
174 # It can take time for ipv6 automatic address to get assigned
175 srv1_v6_addr_assigned = functools.partial(
176 guest_has_address, sshv4_1, ips_from_api_1['6'][i])
Henry Gessau0efcfb92015-02-27 15:24:39 -0500177
Kirill Shileevb1f97522015-02-19 20:39:05 +0300178 srv2_v6_addr_assigned = functools.partial(
179 guest_has_address, sshv4_2, ips_from_api_2['6'][i])
180
181 self.assertTrue(test.call_until_true(srv1_v6_addr_assigned,
182 CONF.compute.ping_timeout, 1))
183
184 self.assertTrue(test.call_until_true(srv2_v6_addr_assigned,
185 CONF.compute.ping_timeout, 1))
186
Yair Friede198e2f2015-07-28 14:43:47 +0300187 self._check_connectivity(sshv4_1, ips_from_api_2['4'])
188 self._check_connectivity(sshv4_2, ips_from_api_1['4'])
Kirill Shileev14113572014-11-21 16:58:02 +0300189
190 # Some VM (like cirros) may not have ping6 utility
Kirill Shileevb1f97522015-02-19 20:39:05 +0300191 result = sshv4_1.exec_command('whereis ping6')
Kirill Shileev14113572014-11-21 16:58:02 +0300192 is_ping6 = False if result == 'ping6:\n' else True
193 if is_ping6:
Kirill Shileevb1f97522015-02-19 20:39:05 +0300194 for i in range(n_subnets6):
Yair Friede198e2f2015-07-28 14:43:47 +0300195 self._check_connectivity(sshv4_1,
196 ips_from_api_2['6'][i])
197 self._check_connectivity(sshv4_1,
198 self.subnets_v6[i].gateway_ip)
199 self._check_connectivity(sshv4_2,
200 ips_from_api_1['6'][i])
201 self._check_connectivity(sshv4_2,
202 self.subnets_v6[i].gateway_ip)
Kirill Shileev14113572014-11-21 16:58:02 +0300203 else:
204 LOG.warning('Ping6 is not available, skipping')
205
Yair Friede198e2f2015-07-28 14:43:47 +0300206 def _check_connectivity(self, source, dest):
207 self.assertTrue(
208 self._check_remote_connectivity(source, dest),
209 "Timed out waiting for %s to become reachable from %s" %
210 (dest, source.ssh_client.host)
211 )
212
Chris Hoge7579c1a2015-02-26 14:12:15 -0800213 @test.idempotent_id('2c92df61-29f0-4eaa-bee3-7c65bef62a43')
Kirill Shileev14113572014-11-21 16:58:02 +0300214 @test.services('compute', 'network')
215 def test_slaac_from_os(self):
216 self._prepare_and_test(address6_mode='slaac')
217
Chris Hoge7579c1a2015-02-26 14:12:15 -0800218 @test.idempotent_id('d7e1f858-187c-45a6-89c9-bdafde619a9f')
Kirill Shileev14113572014-11-21 16:58:02 +0300219 @test.services('compute', 'network')
220 def test_dhcp6_stateless_from_os(self):
221 self._prepare_and_test(address6_mode='dhcpv6-stateless')
Kirill Shileevb1f97522015-02-19 20:39:05 +0300222
223 @test.idempotent_id('7ab23f41-833b-4a16-a7c9-5b42fe6d4123')
224 @test.services('compute', 'network')
225 def test_multi_prefix_dhcpv6_stateless(self):
226 self._prepare_and_test(address6_mode='dhcpv6-stateless', n_subnets6=2)
227
228 @test.idempotent_id('dec222b1-180c-4098-b8c5-cc1b8342d611')
229 @test.services('compute', 'network')
230 def test_multi_prefix_slaac(self):
231 self._prepare_and_test(address6_mode='slaac', n_subnets6=2)
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200232
233 @test.idempotent_id('b6399d76-4438-4658-bcf5-0d6c8584fde2')
234 @test.services('compute', 'network')
235 def test_dualnet_slaac_from_os(self):
236 self._prepare_and_test(address6_mode='slaac', dualnet=True)
237
238 @test.idempotent_id('76f26acd-9688-42b4-bc3e-cd134c4cb09e')
239 @test.services('compute', 'network')
240 def test_dualnet_dhcp6_stateless_from_os(self):
241 self._prepare_and_test(address6_mode='dhcpv6-stateless', dualnet=True)
242
243 @test.idempotent_id('cf1c4425-766b-45b8-be35-e2959728eb00')
244 @test.services('compute', 'network')
245 def test_dualnet_multi_prefix_dhcpv6_stateless(self):
246 self._prepare_and_test(address6_mode='dhcpv6-stateless', n_subnets6=2,
247 dualnet=True)
248
249 @test.idempotent_id('9178ad42-10e4-47e9-8987-e02b170cc5cd')
250 @test.services('compute', 'network')
251 def test_dualnet_multi_prefix_slaac(self):
252 self._prepare_and_test(address6_mode='slaac', n_subnets6=2,
253 dualnet=True)