blob: 6cf73c94be9af446fbb609cceb47b49b84d3a8c5 [file] [log] [blame]
Itzik Browne67ebb52016-05-15 05:34:41 +00001# Copyright 2016 Red Hat, 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.
Itzik Browne67ebb52016-05-15 05:34:41 +000015
Alex Stafeyevc4d9c352016-12-12 04:13:33 -050016from oslo_log import log
17
Itzik Browne67ebb52016-05-15 05:34:41 +000018from tempest.common import waiters
19from tempest.lib.common import ssh
20from tempest.lib.common.utils import data_utils
Jakub Libosvarc0c2f1d2017-01-31 12:12:21 -050021from tempest.lib import exceptions as lib_exc
Itzik Browne67ebb52016-05-15 05:34:41 +000022
23from neutron.tests.tempest.api import base as base_api
24from neutron.tests.tempest import config
25from neutron.tests.tempest.scenario import constants
26
27CONF = config.CONF
Itzik Browne67ebb52016-05-15 05:34:41 +000028
Alex Stafeyevc4d9c352016-12-12 04:13:33 -050029LOG = log.getLogger(__name__)
30
Itzik Browne67ebb52016-05-15 05:34:41 +000031
32class BaseTempestTestCase(base_api.BaseNetworkTest):
33 @classmethod
34 def resource_setup(cls):
35 super(BaseTempestTestCase, cls).resource_setup()
36
37 cls.servers = []
38 cls.keypairs = []
39
40 @classmethod
41 def resource_cleanup(cls):
42 for server in cls.servers:
43 cls.manager.servers_client.delete_server(server)
44 waiters.wait_for_server_termination(cls.manager.servers_client,
45 server)
46
47 for keypair in cls.keypairs:
48 cls.manager.keypairs_client.delete_keypair(
49 keypair_name=keypair['name'])
50
51 super(BaseTempestTestCase, cls).resource_cleanup()
52
53 @classmethod
54 def create_server(cls, flavor_ref, image_ref, key_name, networks,
Itzik Brownbac51dc2016-10-31 12:25:04 +000055 name=None, security_groups=None):
56 """Create a server using tempest lib
57 All the parameters are the ones used in Compute API
58
59 Args:
60 flavor_ref(str): The flavor of the server to be provisioned.
61 image_ref(str): The image of the server to be provisioned.
62 key_name(str): SSH key to to be used to connect to the
63 provisioned server.
64 networks(list): List of dictionaries where each represent
65 an interface to be attached to the server. For network
66 it should be {'uuid': network_uuid} and for port it should
67 be {'port': port_uuid}
68 name(str): Name of the server to be provisioned.
69 security_groups(list): List of dictionaries where
70 the keys is 'name' and the value is the name of
71 the security group. If it's not passed the default
72 security group will be used.
73 """
74
Itzik Browne67ebb52016-05-15 05:34:41 +000075 name = name or data_utils.rand_name('server-test')
Itzik Brownbac51dc2016-10-31 12:25:04 +000076 if not security_groups:
77 security_groups = [{'name': 'default'}]
78
Itzik Browne67ebb52016-05-15 05:34:41 +000079 server = cls.manager.servers_client.create_server(
Itzik Brownbac51dc2016-10-31 12:25:04 +000080 name=name,
81 flavorRef=flavor_ref,
Itzik Browne67ebb52016-05-15 05:34:41 +000082 imageRef=image_ref,
83 key_name=key_name,
Itzik Brownbac51dc2016-10-31 12:25:04 +000084 networks=networks,
85 security_groups=security_groups)
Itzik Browne67ebb52016-05-15 05:34:41 +000086 cls.servers.append(server['server']['id'])
87 return server
88
89 @classmethod
90 def create_keypair(cls, client=None):
91 client = client or cls.manager.keypairs_client
92 name = data_utils.rand_name('keypair-test')
93 body = client.create_keypair(name=name)
94 cls.keypairs.append(body['keypair'])
95 return body['keypair']
96
97 @classmethod
Itzik Brown1ef813a2016-06-06 12:56:21 +000098 def create_secgroup_rules(cls, rule_list, secgroup_id=None):
Itzik Browne67ebb52016-05-15 05:34:41 +000099 client = cls.manager.network_client
100 if not secgroup_id:
101 sgs = client.list_security_groups()['security_groups']
102 for sg in sgs:
103 if sg['name'] == constants.DEFAULT_SECURITY_GROUP:
104 secgroup_id = sg['id']
105 break
106
Itzik Brown1ef813a2016-06-06 12:56:21 +0000107 for rule in rule_list:
108 direction = rule.pop('direction')
109 client.create_security_group_rule(
110 direction=direction,
111 security_group_id=secgroup_id,
112 **rule)
113
114 @classmethod
115 def create_loginable_secgroup_rule(cls, secgroup_id=None):
116 """This rule is intended to permit inbound ssh
117
118 Allowing ssh traffic traffic from all sources, so no group_id is
119 provided.
120 Setting a group_id would only permit traffic from ports
121 belonging to the same security group.
122 """
123
124 rule_list = [{'protocol': 'tcp',
125 'direction': 'ingress',
126 'port_range_min': 22,
127 'port_range_max': 22,
128 'remote_ip_prefix': '0.0.0.0/0'}]
129 cls.create_secgroup_rules(rule_list, secgroup_id=secgroup_id)
Itzik Browne67ebb52016-05-15 05:34:41 +0000130
131 @classmethod
Genadi Chereshnyac0411e92016-07-11 16:59:42 +0300132 def create_router_by_client(cls, is_admin=False, **kwargs):
133 kwargs.update({'router_name': data_utils.rand_name('router'),
134 'admin_state_up': True,
135 'external_network_id': CONF.network.public_network_id})
136 if not is_admin:
137 router = cls.create_router(**kwargs)
138 else:
139 router = cls.create_admin_router(**kwargs)
Alex Stafeyevc4d9c352016-12-12 04:13:33 -0500140 LOG.debug("Created router %s", router['name'])
Itzik Browne67ebb52016-05-15 05:34:41 +0000141 cls.routers.append(router)
142 return router
143
144 @classmethod
145 def create_and_associate_floatingip(cls, port_id):
146 fip = cls.manager.network_client.create_floatingip(
147 CONF.network.public_network_id,
148 port_id=port_id)['floatingip']
149 cls.floating_ips.append(fip)
150 return fip
151
152 @classmethod
Genadi Chereshnyac0411e92016-07-11 16:59:42 +0300153 def setup_network_and_server(cls, router=None, **kwargs):
154 """Create network resources and a server.
Itzik Brownbac51dc2016-10-31 12:25:04 +0000155
156 Creating a network, subnet, router, keypair, security group
157 and a server.
158 """
Itzik Brown1ef813a2016-06-06 12:56:21 +0000159 cls.network = cls.create_network()
Alex Stafeyevc4d9c352016-12-12 04:13:33 -0500160 LOG.debug("Created network %s", cls.network['name'])
Itzik Brown1ef813a2016-06-06 12:56:21 +0000161 cls.subnet = cls.create_subnet(cls.network)
Alex Stafeyevc4d9c352016-12-12 04:13:33 -0500162 LOG.debug("Created subnet %s", cls.subnet['id'])
Itzik Brown1ef813a2016-06-06 12:56:21 +0000163
Itzik Brownbac51dc2016-10-31 12:25:04 +0000164 secgroup = cls.manager.network_client.create_security_group(
165 name=data_utils.rand_name('secgroup-'))
Alex Stafeyevc4d9c352016-12-12 04:13:33 -0500166 LOG.debug("Created security group %s",
167 secgroup['security_group']['name'])
Itzik Brownbac51dc2016-10-31 12:25:04 +0000168 cls.security_groups.append(secgroup['security_group'])
Genadi Chereshnyac0411e92016-07-11 16:59:42 +0300169 if not router:
170 router = cls.create_router_by_client(**kwargs)
171 cls.create_router_interface(router['id'], cls.subnet['id'])
Itzik Brown1ef813a2016-06-06 12:56:21 +0000172 cls.keypair = cls.create_keypair()
Itzik Brownbac51dc2016-10-31 12:25:04 +0000173 cls.create_loginable_secgroup_rule(
174 secgroup_id=secgroup['security_group']['id'])
Itzik Brown1ef813a2016-06-06 12:56:21 +0000175 cls.server = cls.create_server(
176 flavor_ref=CONF.compute.flavor_ref,
177 image_ref=CONF.compute.image_ref,
178 key_name=cls.keypair['name'],
Itzik Brownbac51dc2016-10-31 12:25:04 +0000179 networks=[{'uuid': cls.network['id']}],
180 security_groups=[{'name': secgroup['security_group']['name']}])
Itzik Brown1ef813a2016-06-06 12:56:21 +0000181 waiters.wait_for_server_status(cls.manager.servers_client,
182 cls.server['server']['id'],
183 constants.SERVER_STATUS_ACTIVE)
184 port = cls.client.list_ports(network_id=cls.network['id'],
185 device_id=cls.server[
186 'server']['id'])['ports'][0]
187 cls.fip = cls.create_and_associate_floatingip(port['id'])
Jakub Libosvarc0c2f1d2017-01-31 12:12:21 -0500188
189 def check_connectivity(self, host, ssh_user, ssh_key, servers=None):
190 ssh_client = ssh.Client(host, ssh_user, pkey=ssh_key)
191 try:
192 ssh_client.test_connection_auth()
193 except lib_exc.SSHTimeout as ssh_e:
194 LOG.debug(ssh_e)
195 self._log_console_output(servers)
196 raise
197
198 def _log_console_output(self, servers=None):
199 if not CONF.compute_feature_enabled.console_output:
200 LOG.debug('Console output not supported, cannot log')
201 return
202 if not servers:
203 servers = self.manager.servers_client.list_servers()
204 servers = servers['servers']
205 for server in servers:
206 try:
207 console_output = (
208 self.manager.servers_client.get_console_output(
209 server['id'])['output'])
210 LOG.debug('Console output for %s\nbody=\n%s',
211 server['id'], console_output)
212 except lib_exc.NotFound:
213 LOG.debug("Server %s disappeared(deleted) while looking "
214 "for the console log", server['id'])