blob: a18dd2e57c521b434011a830717bc5430628392c [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):
Ken'ichi Ohmichic4e4f1c2015-11-17 08:16:12 +000073 """Prepare network
74
75 Creates network with given number of IPv6 subnets in the given mode and
76 one IPv4 subnet.
77 Creates router with ports on all subnets.
78 if dualnet - create IPv6 subnets on a different network
79 :return: list of created networks
Kirill Shileev14113572014-11-21 16:58:02 +030080 """
Matthew Treinish8e48ad62014-12-12 11:07:23 -050081 self.network = self._create_network(tenant_id=self.tenant_id)
Daniel Mellado9e3e1062015-08-06 18:07:05 +020082 if dualnet:
83 self.network_v6 = self._create_network(tenant_id=self.tenant_id)
84
Matthew Treinish8e48ad62014-12-12 11:07:23 -050085 sub4 = self._create_subnet(network=self.network,
Kirill Shileev14113572014-11-21 16:58:02 +030086 namestart='sub4',
Yair Friede198e2f2015-07-28 14:43:47 +030087 ip_version=4)
Kirill Shileev14113572014-11-21 16:58:02 +030088
89 router = self._get_router(tenant_id=self.tenant_id)
90 sub4.add_to_router(router_id=router['id'])
Kirill Shileev14113572014-11-21 16:58:02 +030091 self.addCleanup(sub4.delete)
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):
Daniel Mellado9e3e1062015-08-06 18:07:05 +020095 net6 = self.network_v6 if dualnet else self.network
96 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
102 sub6.add_to_router(router_id=router['id'])
103 self.addCleanup(sub6.delete)
Yair Friede198e2f2015-07-28 14:43:47 +0300104 self.subnets_v6.append(sub6)
Kirill Shileev14113572014-11-21 16:58:02 +0300105
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200106 return [self.network, self.network_v6] if dualnet else [self.network]
107
Kirill Shileev14113572014-11-21 16:58:02 +0300108 @staticmethod
109 def define_server_ips(srv):
Kirill Shileevb1f97522015-02-19 20:39:05 +0300110 ips = {'4': None, '6': []}
Matthew Treinish71426682015-04-23 11:19:38 -0400111 for net_name, nics in six.iteritems(srv['addresses']):
Kirill Shileev14113572014-11-21 16:58:02 +0300112 for nic in nics:
113 if nic['version'] == 6:
Kirill Shileevb1f97522015-02-19 20:39:05 +0300114 ips['6'].append(nic['addr'])
Kirill Shileev14113572014-11-21 16:58:02 +0300115 else:
Kirill Shileevb1f97522015-02-19 20:39:05 +0300116 ips['4'] = nic['addr']
117 return ips
Kirill Shileev14113572014-11-21 16:58:02 +0300118
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200119 def prepare_server(self, networks=None):
Kirill Shileev14113572014-11-21 16:58:02 +0300120 username = CONF.compute.image_ssh_user
121
Matthew Treinish8e48ad62014-12-12 11:07:23 -0500122 create_kwargs = self.srv_kwargs
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200123 networks = networks or [self.network]
124 create_kwargs['networks'] = [{'uuid': n.id} for n in networks]
Matthew Treinish8e48ad62014-12-12 11:07:23 -0500125
126 srv = self.create_server(create_kwargs=create_kwargs)
Kirill Shileev14113572014-11-21 16:58:02 +0300127 fip = self.create_floating_ip(thing=srv)
Kirill Shileevb1f97522015-02-19 20:39:05 +0300128 ips = self.define_server_ips(srv=srv)
Kirill Shileev14113572014-11-21 16:58:02 +0300129 ssh = self.get_remote_client(
130 server_or_ip=fip.floating_ip_address,
131 username=username)
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200132 return ssh, ips, srv["id"]
Kirill Shileev14113572014-11-21 16:58:02 +0300133
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200134 def turn_nic6_on(self, ssh, sid):
135 """Turns the IPv6 vNIC on
Kirill Shileev14113572014-11-21 16:58:02 +0300136
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200137 Required because guest images usually set only the first vNIC on boot.
138 Searches for the IPv6 vNIC's MAC and brings it up.
139
140 @param ssh: RemoteClient ssh instance to server
141 @param sid: server uuid
142 """
143 ports = [p["mac_address"] for p in
144 self._list_ports(device_id=sid,
145 network_id=self.network_v6.id)]
146 self.assertEqual(1, len(ports),
Ken'ichi Ohmichi695ac5c2015-10-13 03:07:17 +0000147 message=("Multiple IPv6 ports found on network %s. "
148 "ports: %s")
149 % (self.network_v6, ports))
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200150 mac6 = ports[0]
Yair Friedbc46f592015-11-18 16:29:34 +0200151 ssh.set_nic_state(ssh.get_nic_name(mac6))
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200152
153 def _prepare_and_test(self, address6_mode, n_subnets6=1, dualnet=False):
154 net_list = self.prepare_network(address6_mode=address6_mode,
155 n_subnets6=n_subnets6,
156 dualnet=dualnet)
157
158 sshv4_1, ips_from_api_1, sid1 = self.prepare_server(networks=net_list)
159 sshv4_2, ips_from_api_2, sid2 = self.prepare_server(networks=net_list)
Kirill Shileev14113572014-11-21 16:58:02 +0300160
Henry Gessau0efcfb92015-02-27 15:24:39 -0500161 def guest_has_address(ssh, addr):
162 return addr in ssh.get_ip_list()
163
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200164 # Turn on 2nd NIC for Cirros when dualnet
165 if dualnet:
166 self.turn_nic6_on(sshv4_1, sid1)
167 self.turn_nic6_on(sshv4_2, sid2)
168
Kirill Shileevb1f97522015-02-19 20:39:05 +0300169 # get addresses assigned to vNIC as reported by 'ip address' utility
170 ips_from_ip_1 = sshv4_1.get_ip_list()
171 ips_from_ip_2 = sshv4_2.get_ip_list()
172 self.assertIn(ips_from_api_1['4'], ips_from_ip_1)
173 self.assertIn(ips_from_api_2['4'], ips_from_ip_2)
174 for i in range(n_subnets6):
175 # v6 should be configured since the image supports it
176 # It can take time for ipv6 automatic address to get assigned
177 srv1_v6_addr_assigned = functools.partial(
178 guest_has_address, sshv4_1, ips_from_api_1['6'][i])
Henry Gessau0efcfb92015-02-27 15:24:39 -0500179
Kirill Shileevb1f97522015-02-19 20:39:05 +0300180 srv2_v6_addr_assigned = functools.partial(
181 guest_has_address, sshv4_2, ips_from_api_2['6'][i])
182
183 self.assertTrue(test.call_until_true(srv1_v6_addr_assigned,
184 CONF.compute.ping_timeout, 1))
185
186 self.assertTrue(test.call_until_true(srv2_v6_addr_assigned,
187 CONF.compute.ping_timeout, 1))
188
Yair Friede198e2f2015-07-28 14:43:47 +0300189 self._check_connectivity(sshv4_1, ips_from_api_2['4'])
190 self._check_connectivity(sshv4_2, ips_from_api_1['4'])
Kirill Shileev14113572014-11-21 16:58:02 +0300191
Sean M. Collinsc0378482015-10-26 12:59:47 +0900192 for i in range(n_subnets6):
193 self._check_connectivity(sshv4_1,
194 ips_from_api_2['6'][i])
195 self._check_connectivity(sshv4_1,
196 self.subnets_v6[i].gateway_ip)
197 self._check_connectivity(sshv4_2,
198 ips_from_api_1['6'][i])
199 self._check_connectivity(sshv4_2,
200 self.subnets_v6[i].gateway_ip)
Kirill Shileev14113572014-11-21 16:58:02 +0300201
Yair Friede198e2f2015-07-28 14:43:47 +0300202 def _check_connectivity(self, source, dest):
203 self.assertTrue(
204 self._check_remote_connectivity(source, dest),
205 "Timed out waiting for %s to become reachable from %s" %
206 (dest, source.ssh_client.host)
207 )
208
Chris Hoge7579c1a2015-02-26 14:12:15 -0800209 @test.idempotent_id('2c92df61-29f0-4eaa-bee3-7c65bef62a43')
Kirill Shileev14113572014-11-21 16:58:02 +0300210 @test.services('compute', 'network')
211 def test_slaac_from_os(self):
212 self._prepare_and_test(address6_mode='slaac')
213
Chris Hoge7579c1a2015-02-26 14:12:15 -0800214 @test.idempotent_id('d7e1f858-187c-45a6-89c9-bdafde619a9f')
Kirill Shileev14113572014-11-21 16:58:02 +0300215 @test.services('compute', 'network')
216 def test_dhcp6_stateless_from_os(self):
217 self._prepare_and_test(address6_mode='dhcpv6-stateless')
Kirill Shileevb1f97522015-02-19 20:39:05 +0300218
219 @test.idempotent_id('7ab23f41-833b-4a16-a7c9-5b42fe6d4123')
220 @test.services('compute', 'network')
221 def test_multi_prefix_dhcpv6_stateless(self):
222 self._prepare_and_test(address6_mode='dhcpv6-stateless', n_subnets6=2)
223
224 @test.idempotent_id('dec222b1-180c-4098-b8c5-cc1b8342d611')
225 @test.services('compute', 'network')
226 def test_multi_prefix_slaac(self):
227 self._prepare_and_test(address6_mode='slaac', n_subnets6=2)
Daniel Mellado9e3e1062015-08-06 18:07:05 +0200228
229 @test.idempotent_id('b6399d76-4438-4658-bcf5-0d6c8584fde2')
230 @test.services('compute', 'network')
231 def test_dualnet_slaac_from_os(self):
232 self._prepare_and_test(address6_mode='slaac', dualnet=True)
233
234 @test.idempotent_id('76f26acd-9688-42b4-bc3e-cd134c4cb09e')
235 @test.services('compute', 'network')
236 def test_dualnet_dhcp6_stateless_from_os(self):
237 self._prepare_and_test(address6_mode='dhcpv6-stateless', dualnet=True)
238
239 @test.idempotent_id('cf1c4425-766b-45b8-be35-e2959728eb00')
240 @test.services('compute', 'network')
241 def test_dualnet_multi_prefix_dhcpv6_stateless(self):
242 self._prepare_and_test(address6_mode='dhcpv6-stateless', n_subnets6=2,
243 dualnet=True)
244
245 @test.idempotent_id('9178ad42-10e4-47e9-8987-e02b170cc5cd')
246 @test.services('compute', 'network')
247 def test_dualnet_multi_prefix_slaac(self):
248 self._prepare_and_test(address6_mode='slaac', n_subnets6=2,
249 dualnet=True)