blob: dc82217ee1738ee84677af501cdfae6a9665cbbc [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.
15import netaddr
16from tempest import config
17from tempest.openstack.common import log as logging
18from tempest.scenario import manager
19from tempest import test
20
21
22CONF = config.CONF
23LOG = logging.getLogger(__name__)
24
25
26class TestGettingAddress(manager.NetworkScenarioTest):
27 """Create network with 2 subnets: IPv4 and IPv6 in a given address mode
28 Boot 2 VMs on this network
29 Allocate and assign 2 FIP4
30 Check that vNIC of server matches port data from OpenStack DB
31 Ping4 tenant IPv4 of one VM from another one
32 Will do the same with ping6 when available in VM
33 """
34
35 @classmethod
36 def resource_setup(cls):
37 # Create no network resources for these tests.
38 cls.set_network_resources()
39 super(TestGettingAddress, cls).resource_setup()
40
41 @classmethod
42 def check_preconditions(cls):
43 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')
46 if not (CONF.network.tenant_networks_reachable
47 or CONF.network.public_network_id):
48 msg = ('Either tenant_networks_reachable must be "true", or '
49 'public_network_id must be defined.')
Kirill Shileev14113572014-11-21 16:58:02 +030050 raise cls.skipException(msg)
Adam Gandelmanab6106d2014-12-12 10:38:23 -080051 if CONF.baremetal.driver_enabled:
52 msg = ('Baremetal does not currently support network isolation')
53 raise cls.skipException(msg)
Adam Gandelman721f80d2014-12-12 11:03:14 -080054
Kirill Shileev14113572014-11-21 16:58:02 +030055 super(TestGettingAddress, cls).check_preconditions()
56
57 def setUp(self):
58 super(TestGettingAddress, self).setUp()
59 self.keypair = self.create_keypair()
60 self.sec_grp = self._create_security_group(tenant_id=self.tenant_id)
61 self.srv_kwargs = {
62 'key_name': self.keypair['name'],
ghanshyamfc5e0c72015-01-29 15:09:40 +090063 'security_groups': [{'name': self.sec_grp['name']}]}
Kirill Shileev14113572014-11-21 16:58:02 +030064
65 def prepare_network(self, address6_mode):
66 """Creates network with
67 one IPv6 subnet in the given mode and
68 one IPv4 subnet
69 Creates router with ports on both subnets
70 """
Matthew Treinish8e48ad62014-12-12 11:07:23 -050071 self.network = self._create_network(tenant_id=self.tenant_id)
72 sub4 = self._create_subnet(network=self.network,
Kirill Shileev14113572014-11-21 16:58:02 +030073 namestart='sub4',
74 ip_version=4,)
75 # since https://bugs.launchpad.net/neutron/+bug/1394112 we need
76 # to specify gateway_ip manually
77 net_range = netaddr.IPNetwork(CONF.network.tenant_network_v6_cidr)
78 gateway_ip = (netaddr.IPAddress(net_range) + 1).format()
Matthew Treinish8e48ad62014-12-12 11:07:23 -050079 sub6 = self._create_subnet(network=self.network,
Kirill Shileev14113572014-11-21 16:58:02 +030080 namestart='sub6',
81 ip_version=6,
82 gateway_ip=gateway_ip,
83 ipv6_ra_mode=address6_mode,
84 ipv6_address_mode=address6_mode)
85
86 router = self._get_router(tenant_id=self.tenant_id)
87 sub4.add_to_router(router_id=router['id'])
88 sub6.add_to_router(router_id=router['id'])
89 self.addCleanup(sub4.delete)
90 self.addCleanup(sub6.delete)
91
92 @staticmethod
93 def define_server_ips(srv):
94 for net_name, nics in srv['addresses'].iteritems():
95 for nic in nics:
96 if nic['version'] == 6:
97 srv['accessIPv6'] = nic['addr']
98 else:
99 srv['accessIPv4'] = nic['addr']
100
101 def prepare_server(self):
102 username = CONF.compute.image_ssh_user
103
Matthew Treinish8e48ad62014-12-12 11:07:23 -0500104 create_kwargs = self.srv_kwargs
105 create_kwargs['networks'] = [{'uuid': self.network.id}]
106
107 srv = self.create_server(create_kwargs=create_kwargs)
Kirill Shileev14113572014-11-21 16:58:02 +0300108 fip = self.create_floating_ip(thing=srv)
109 self.define_server_ips(srv=srv)
110 ssh = self.get_remote_client(
111 server_or_ip=fip.floating_ip_address,
112 username=username)
113 return ssh, srv
114
115 def _prepare_and_test(self, address6_mode):
116 self.prepare_network(address6_mode=address6_mode)
117
118 ssh1, srv1 = self.prepare_server()
119 ssh2, srv2 = self.prepare_server()
120
121 result = ssh1.get_ip_list()
122 self.assertIn(srv1['accessIPv4'], result)
123 # v6 should be configured since the image supports it
124 self.assertIn(srv1['accessIPv6'], result)
125 result = ssh2.get_ip_list()
126 self.assertIn(srv2['accessIPv4'], result)
127 # v6 should be configured since the image supports it
128 self.assertIn(srv2['accessIPv6'], result)
129 result = ssh1.ping_host(srv2['accessIPv4'])
130 self.assertIn('0% packet loss', result)
131 result = ssh2.ping_host(srv1['accessIPv4'])
132 self.assertIn('0% packet loss', result)
133
134 # Some VM (like cirros) may not have ping6 utility
135 result = ssh1.exec_command('whereis ping6')
136 is_ping6 = False if result == 'ping6:\n' else True
137 if is_ping6:
138 result = ssh1.ping_host(srv2['accessIPv6'])
139 self.assertIn('0% packet loss', result)
140 result = ssh2.ping_host(srv1['accessIPv6'])
141 self.assertIn('0% packet loss', result)
142 else:
143 LOG.warning('Ping6 is not available, skipping')
144
145 @test.services('compute', 'network')
146 def test_slaac_from_os(self):
147 self._prepare_and_test(address6_mode='slaac')
148
149 @test.services('compute', 'network')
150 def test_dhcp6_stateless_from_os(self):
151 self._prepare_and_test(address6_mode='dhcpv6-stateless')