blob: 9862e121086a842cb0fede69a399514ec4761862 [file] [log] [blame]
Jude Cross986e3f52017-07-24 14:57:20 -07001# Copyright 2018 Rackspace US Inc. All rights reserved.
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may
4# not use this file except in compliance with the License. You may obtain
5# a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations
13# under the License.
14
15import ipaddress
16import pkg_resources
17import random
18import shlex
19import six
20import string
21import subprocess
22import tempfile
23
24from oslo_log import log as logging
25from oslo_utils import uuidutils
26from tempest import config
27from tempest.lib.common.utils import data_utils
28from tempest.lib.common.utils.linux import remote_client
Jude Cross986e3f52017-07-24 14:57:20 -070029from tempest.lib import exceptions
30from tempest import test
31
32from octavia_tempest_plugin import clients
33from octavia_tempest_plugin.common import constants as const
34from octavia_tempest_plugin.tests import validators
35from octavia_tempest_plugin.tests import waiters
36
37CONF = config.CONF
38LOG = logging.getLogger(__name__)
39
40
41class LoadBalancerBaseTest(test.BaseTestCase):
42 """Base class for load balancer tests."""
43
44 # Setup cls.os_roles_lb_member. cls.os_primary, cls.os_roles_lb_member,
45 # and cls.os_roles_lb_admin credentials.
46 credentials = ['admin', 'primary',
47 ['lb_member', CONF.load_balancer.member_role],
48 ['lb_member2', CONF.load_balancer.member_role],
49 ['lb_admin', CONF.load_balancer.admin_role]]
50
51 client_manager = clients.ManagerV2
52
53 @classmethod
54 def skip_checks(cls):
55 """Check if we should skip all of the children tests."""
56 super(LoadBalancerBaseTest, cls).skip_checks()
57
58 service_list = {
59 'load_balancer': CONF.service_available.load_balancer,
60 }
61
62 live_service_list = {
63 'compute': CONF.service_available.nova,
64 'image': CONF.service_available.glance,
65 'neutron': CONF.service_available.neutron
66 }
67
68 if not CONF.load_balancer.test_with_noop:
69 service_list.update(live_service_list)
70
71 for service, available in service_list.items():
72 if not available:
73 skip_msg = ("{0} skipped as {1} serivce is not "
74 "available.".format(cls.__name__, service))
75 raise cls.skipException(skip_msg)
76
77 # We must be able to reach our VIP and instances
78 if not (CONF.network.project_networks_reachable
79 or CONF.network.public_network_id):
80 msg = ('Either project_networks_reachable must be "true", or '
81 'public_network_id must be defined.')
82 raise cls.skipException(msg)
83
84 @classmethod
85 def setup_credentials(cls):
86 """Setup test credentials and network resources."""
87 # Do not auto create network resources
88 cls.set_network_resources()
89 super(LoadBalancerBaseTest, cls).setup_credentials()
90
91 @classmethod
92 def setup_clients(cls):
93 """Setup client aliases."""
94 super(LoadBalancerBaseTest, cls).setup_clients()
95 cls.lb_mem_float_ip_client = cls.os_roles_lb_member.floating_ips_client
96 cls.lb_mem_keypairs_client = cls.os_roles_lb_member.keypairs_client
97 cls.lb_mem_net_client = cls.os_roles_lb_member.networks_client
98 cls.lb_mem_ports_client = cls.os_roles_lb_member.ports_client
99 cls.lb_mem_routers_client = cls.os_roles_lb_member.routers_client
100 cls.lb_mem_SG_client = cls.os_roles_lb_member.security_groups_client
101 cls.lb_mem_SGr_client = (
102 cls.os_roles_lb_member.security_group_rules_client)
103 cls.lb_mem_servers_client = cls.os_roles_lb_member.servers_client
104 cls.lb_mem_subnet_client = cls.os_roles_lb_member.subnets_client
105 cls.mem_lb_client = cls.os_roles_lb_member.loadbalancer_client
Jude Crossfbbd2b42017-08-09 15:21:04 -0700106 cls.mem_listener_client = cls.os_roles_lb_member.listener_client
Adam Harwell8ffce3e2018-05-01 21:18:44 -0700107 cls.mem_pool_client = cls.os_roles_lb_member.pool_client
Jude Cross986e3f52017-07-24 14:57:20 -0700108
109 @classmethod
110 def resource_setup(cls):
111 """Setup resources needed by the tests."""
112 super(LoadBalancerBaseTest, cls).resource_setup()
113
114 conf_lb = CONF.load_balancer
115
116 if conf_lb.test_subnet_override and not conf_lb.test_network_override:
117 raise exceptions.InvalidConfiguration(
118 "Configuration value test_network_override must be "
119 "specified if test_subnet_override is used.")
120
121 show_subnet = cls.lb_mem_subnet_client.show_subnet
122 if CONF.load_balancer.test_with_noop:
123 cls.lb_member_vip_net = {'id': uuidutils.generate_uuid()}
124 cls.lb_member_vip_subnet = {'id': uuidutils.generate_uuid()}
125 cls.lb_member_1_net = {'id': uuidutils.generate_uuid()}
126 cls.lb_member_1_subnet = {'id': uuidutils.generate_uuid()}
127 cls.lb_member_2_net = {'id': uuidutils.generate_uuid()}
128 cls.lb_member_2_subnet = {'id': uuidutils.generate_uuid()}
129 if CONF.load_balancer.test_with_ipv6:
130 cls.lb_member_vip_ipv6_subnet = {'id':
131 uuidutils.generate_uuid()}
132 cls.lb_member_1_ipv6_subnet = {'id': uuidutils.generate_uuid()}
133 cls.lb_member_2_ipv6_subnet = {'id': uuidutils.generate_uuid()}
134 return
135 elif CONF.load_balancer.test_network_override:
136 if conf_lb.test_subnet_override:
137 override_subnet = show_subnet(conf_lb.test_subnet_override)
138 else:
139 override_subnet = None
140
141 show_net = cls.lb_mem_net_client.show_network
142 override_network = show_net(conf_lb.test_network_override)
143 override_network = override_network.get('network')
144
145 cls.lb_member_vip_net = override_network
146 cls.lb_member_vip_subnet = override_subnet
147 cls.lb_member_1_net = override_network
148 cls.lb_member_1_subnet = override_subnet
149 cls.lb_member_2_net = override_network
150 cls.lb_member_2_subnet = override_subnet
151
152 if (CONF.load_balancer.test_with_ipv6 and
153 conf_lb.test_IPv6_subnet_override):
154 override_ipv6_subnet = show_subnet(
155 conf_lb.test_IPv6_subnet_override)
156 cls.lb_member_vip_ipv6_subnet = override_ipv6_subnet
157 cls.lb_member_1_ipv6_subnet = override_ipv6_subnet
158 cls.lb_member_2_ipv6_subnet = override_ipv6_subnet
159 else:
160 cls.lb_member_vip_ipv6_subnet = None
161 cls.lb_member_1_ipv6_subnet = None
162 cls.lb_member_2_ipv6_subnet = None
163 else:
164 cls._create_networks()
165
166 LOG.debug('Octavia Setup: lb_member_vip_net = {}'.format(
167 cls.lb_member_vip_net[const.ID]))
168 if cls.lb_member_vip_subnet:
169 LOG.debug('Octavia Setup: lb_member_vip_subnet = {}'.format(
170 cls.lb_member_vip_subnet[const.ID]))
171 LOG.debug('Octavia Setup: lb_member_1_net = {}'.format(
172 cls.lb_member_1_net[const.ID]))
173 if cls.lb_member_1_subnet:
174 LOG.debug('Octavia Setup: lb_member_1_subnet = {}'.format(
175 cls.lb_member_1_subnet[const.ID]))
176 LOG.debug('Octavia Setup: lb_member_2_net = {}'.format(
177 cls.lb_member_2_net[const.ID]))
178 if cls.lb_member_2_subnet:
179 LOG.debug('Octavia Setup: lb_member_2_subnet = {}'.format(
180 cls.lb_member_2_subnet[const.ID]))
181 if cls.lb_member_vip_ipv6_subnet:
182 LOG.debug('Octavia Setup: lb_member_vip_ipv6_subnet = {}'.format(
183 cls.lb_member_vip_ipv6_subnet[const.ID]))
184 if cls.lb_member_1_ipv6_subnet:
185 LOG.debug('Octavia Setup: lb_member_1_ipv6_subnet = {}'.format(
186 cls.lb_member_1_ipv6_subnet[const.ID]))
187 if cls.lb_member_2_ipv6_subnet:
188 LOG.debug('Octavia Setup: lb_member_2_ipv6_subnet = {}'.format(
189 cls.lb_member_2_ipv6_subnet[const.ID]))
190
191 # If validation is disabled in this cloud, we won't be able to
192 # start the webservers, so don't even boot them.
193 if not CONF.validation.run_validation:
194 return
195
196 # Create a keypair for the webservers
197 keypair_name = data_utils.rand_name('lb_member_keypair')
198 result = cls.lb_mem_keypairs_client.create_keypair(
199 name=keypair_name)
200 cls.lb_member_keypair = result['keypair']
201 LOG.info('lb_member_keypair: {}'.format(cls.lb_member_keypair))
202 cls.addClassResourceCleanup(
203 waiters.wait_for_not_found,
204 cls.lb_mem_keypairs_client.delete_keypair,
205 cls.lb_mem_keypairs_client.show_keypair,
206 keypair_name)
207
208 if (CONF.load_balancer.enable_security_groups and
209 CONF.network_feature_enabled.port_security):
210 # Set up the security group for the webservers
211 SG_name = data_utils.rand_name('lb_member_SG')
212 cls.lb_member_sec_group = (
213 cls.lb_mem_SG_client.create_security_group(
214 name=SG_name)['security_group'])
215 cls.addClassResourceCleanup(
216 waiters.wait_for_not_found,
217 cls.lb_mem_SG_client.delete_security_group,
218 cls.lb_mem_SG_client.show_security_group,
219 cls.lb_member_sec_group['id'])
220
221 # Create a security group rule to allow 80-81 (test webservers)
222 SGr = cls.lb_mem_SGr_client.create_security_group_rule(
223 direction='ingress',
224 security_group_id=cls.lb_member_sec_group['id'],
225 protocol='tcp',
226 ethertype='IPv4',
227 port_range_min=80,
228 port_range_max=81)['security_group_rule']
229 cls.addClassResourceCleanup(
230 waiters.wait_for_not_found,
231 cls.lb_mem_SGr_client.delete_security_group_rule,
232 cls.lb_mem_SGr_client.show_security_group_rule,
233 SGr['id'])
234 # Create a security group rule to allow 22 (ssh)
235 SGr = cls.lb_mem_SGr_client.create_security_group_rule(
236 direction='ingress',
237 security_group_id=cls.lb_member_sec_group['id'],
238 protocol='tcp',
239 ethertype='IPv4',
240 port_range_min=22,
241 port_range_max=22)['security_group_rule']
242 cls.addClassResourceCleanup(
243 waiters.wait_for_not_found,
244 cls.lb_mem_SGr_client.delete_security_group_rule,
245 cls.lb_mem_SGr_client.show_security_group_rule,
246 SGr['id'])
247 if CONF.load_balancer.test_with_ipv6:
248 # Create a security group rule to allow 80-81 (test webservers)
249 SGr = cls.lb_mem_SGr_client.create_security_group_rule(
250 direction='ingress',
251 security_group_id=cls.lb_member_sec_group['id'],
252 protocol='tcp',
253 ethertype='IPv6',
254 port_range_min=80,
255 port_range_max=81)['security_group_rule']
256 cls.addClassResourceCleanup(
257 waiters.wait_for_not_found,
258 cls.lb_mem_SGr_client.delete_security_group_rule,
259 cls.lb_mem_SGr_client.show_security_group_rule,
260 SGr['id'])
261 # Create a security group rule to allow 22 (ssh)
262 SGr = cls.lb_mem_SGr_client.create_security_group_rule(
263 direction='ingress',
264 security_group_id=cls.lb_member_sec_group['id'],
265 protocol='tcp',
266 ethertype='IPv6',
267 port_range_min=22,
268 port_range_max=22)['security_group_rule']
269 cls.addClassResourceCleanup(
270 waiters.wait_for_not_found,
271 cls.lb_mem_SGr_client.delete_security_group_rule,
272 cls.lb_mem_SGr_client.show_security_group_rule,
273 SGr['id'])
274
275 LOG.info('lb_member_sec_group: {}'.format(cls.lb_member_sec_group))
276
277 # Create webserver 1 instance
278 server_details = cls._create_webserver('lb_member_webserver1',
279 cls.lb_member_1_net)
280
281 cls.lb_member_webserver1 = server_details['server']
282 cls.webserver1_ip = server_details.get('ipv4_address')
283 cls.webserver1_ipv6 = server_details.get('ipv6_address')
284 cls.webserver1_public_ip = server_details['public_ipv4_address']
285
286 LOG.debug('Octavia Setup: lb_member_webserver1 = {}'.format(
287 cls.lb_member_webserver1[const.ID]))
288 LOG.debug('Octavia Setup: webserver1_ip = {}'.format(
289 cls.webserver1_ip))
290 LOG.debug('Octavia Setup: webserver1_ipv6 = {}'.format(
291 cls.webserver1_ipv6))
292 LOG.debug('Octavia Setup: webserver1_public_ip = {}'.format(
293 cls.webserver1_public_ip))
294
295 cls._install_start_webserver(cls.webserver1_public_ip,
296 cls.lb_member_keypair['private_key'], 1)
297
298 # Validate webserver 1
299 cls._validate_webserver(cls.webserver1_public_ip, 1)
300
301 # Create webserver 2 instance
302 server_details = cls._create_webserver('lb_member_webserver2',
303 cls.lb_member_2_net)
304
305 cls.lb_member_webserver2 = server_details['server']
306 cls.webserver2_ip = server_details.get('ipv4_address')
307 cls.webserver2_ipv6 = server_details.get('ipv6_address')
308 cls.webserver2_public_ip = server_details['public_ipv4_address']
309
310 LOG.debug('Octavia Setup: lb_member_webserver2 = {}'.format(
311 cls.lb_member_webserver2[const.ID]))
312 LOG.debug('Octavia Setup: webserver2_ip = {}'.format(
313 cls.webserver2_ip))
314 LOG.debug('Octavia Setup: webserver2_ipv6 = {}'.format(
315 cls.webserver2_ipv6))
316 LOG.debug('Octavia Setup: webserver2_public_ip = {}'.format(
317 cls.webserver2_public_ip))
318
319 cls._install_start_webserver(cls.webserver2_public_ip,
320 cls.lb_member_keypair['private_key'], 5)
321
322 # Validate webserver 2
323 cls._validate_webserver(cls.webserver2_public_ip, 5)
324
325 @classmethod
326 def _install_start_webserver(cls, ip_address, ssh_key, start_id):
327 local_file = pkg_resources.resource_filename(
328 'octavia_tempest_plugin.contrib.httpd', 'httpd.bin')
329 dest_file = '/dev/shm/httpd.bin'
330
331 linux_client = remote_client.RemoteClient(
332 ip_address, CONF.validation.image_ssh_user, pkey=ssh_key)
333 linux_client.validate_authentication()
334
335 with tempfile.NamedTemporaryFile() as key:
336 key.write(ssh_key.encode('utf-8'))
337 key.flush()
338 cmd = ("scp -v -o UserKnownHostsFile=/dev/null "
339 "-o StrictHostKeyChecking=no "
340 "-o ConnectTimeout={0} -o ConnectionAttempts={1} "
341 "-i {2} {3} {4}@{5}:{6}").format(
342 CONF.load_balancer.scp_connection_timeout,
343 CONF.load_balancer.scp_connection_attempts,
344 key.name, local_file, CONF.validation.image_ssh_user,
345 ip_address, dest_file)
346 args = shlex.split(cmd)
347 subprocess_args = {'stdout': subprocess.PIPE,
348 'stderr': subprocess.STDOUT,
349 'cwd': None}
350 proc = subprocess.Popen(args, **subprocess_args)
351 stdout, stderr = proc.communicate()
352 if proc.returncode != 0:
353 raise exceptions.CommandFailed(proc.returncode, cmd,
354 stdout, stderr)
355 linux_client.exec_command('sudo screen -d -m {0} -port 80 '
356 '-id {1}'.format(dest_file, start_id))
357 linux_client.exec_command('sudo screen -d -m {0} -port 81 '
358 '-id {1}'.format(dest_file, start_id + 1))
359
360 @classmethod
361 def _create_networks(cls):
362 """Creates networks, subnets, and routers used in tests.
363
364 The following are expected to be defined and available to the tests:
365 cls.lb_member_vip_net
366 cls.lb_member_vip_subnet
367 cls.lb_member_vip_ipv6_subnet (optional)
368 cls.lb_member_1_net
369 cls.lb_member_1_subnet
370 cls.lb_member_1_ipv6_subnet (optional)
371 cls.lb_member_2_net
372 cls.lb_member_2_subnet
373 cls.lb_member_2_ipv6_subnet (optional)
374 """
375
376 # Create tenant VIP network
377 network_kwargs = {
378 'name': data_utils.rand_name("lb_member_vip_network")}
379 if CONF.network_feature_enabled.port_security:
380 # Note: Allowed Address Pairs requires port security
381 network_kwargs['port_security_enabled'] = True
382 result = cls.lb_mem_net_client.create_network(**network_kwargs)
383 cls.lb_member_vip_net = result['network']
384 LOG.info('lb_member_vip_net: {}'.format(cls.lb_member_vip_net))
385 cls.addClassResourceCleanup(
386 waiters.wait_for_not_found,
387 cls.lb_mem_net_client.delete_network,
388 cls.lb_mem_net_client.show_network,
389 cls.lb_member_vip_net['id'])
390
391 # Create tenant VIP subnet
392 subnet_kwargs = {
393 'name': data_utils.rand_name("lb_member_vip_subnet"),
394 'network_id': cls.lb_member_vip_net['id'],
395 'cidr': CONF.load_balancer.vip_subnet_cidr,
396 'ip_version': 4}
397 result = cls.lb_mem_subnet_client.create_subnet(**subnet_kwargs)
398 cls.lb_member_vip_subnet = result['subnet']
399 LOG.info('lb_member_vip_subnet: {}'.format(cls.lb_member_vip_subnet))
400 cls.addClassResourceCleanup(
401 waiters.wait_for_not_found,
402 cls.lb_mem_subnet_client.delete_subnet,
403 cls.lb_mem_subnet_client.show_subnet,
404 cls.lb_member_vip_subnet['id'])
405
406 # Create tenant VIP IPv6 subnet
407 if CONF.load_balancer.test_with_ipv6:
408 subnet_kwargs = {
409 'name': data_utils.rand_name("lb_member_vip_ipv6_subnet"),
410 'network_id': cls.lb_member_vip_net['id'],
411 'cidr': CONF.load_balancer.vip_ipv6_subnet_cidr,
412 'ip_version': 6}
413 result = cls.lb_mem_subnet_client.create_subnet(**subnet_kwargs)
414 cls.lb_member_vip_ipv6_subnet = result['subnet']
415 LOG.info('lb_member_vip_ipv6_subnet: {}'.format(
416 cls.lb_member_vip_ipv6_subnet))
417 cls.addClassResourceCleanup(
418 waiters.wait_for_not_found,
419 cls.lb_mem_subnet_client.delete_subnet,
420 cls.lb_mem_subnet_client.show_subnet,
421 cls.lb_member_vip_ipv6_subnet['id'])
422
423 # Create tenant member 1 network
424 network_kwargs = {
425 'name': data_utils.rand_name("lb_member_1_network")}
426 if CONF.network_feature_enabled.port_security:
427 if CONF.load_balancer.enable_security_groups:
428 network_kwargs['port_security_enabled'] = True
429 else:
430 network_kwargs['port_security_enabled'] = False
431 result = cls.lb_mem_net_client.create_network(**network_kwargs)
432 cls.lb_member_1_net = result['network']
433 LOG.info('lb_member_1_net: {}'.format(cls.lb_member_1_net))
434 cls.addClassResourceCleanup(
435 waiters.wait_for_not_found,
436 cls.lb_mem_net_client.delete_network,
437 cls.lb_mem_net_client.show_network,
438 cls.lb_member_1_net['id'])
439
440 # Create tenant member 1 subnet
441 subnet_kwargs = {
442 'name': data_utils.rand_name("lb_member_1_subnet"),
443 'network_id': cls.lb_member_1_net['id'],
444 'cidr': CONF.load_balancer.member_1_ipv4_subnet_cidr,
445 'ip_version': 4}
446 result = cls.lb_mem_subnet_client.create_subnet(**subnet_kwargs)
447 cls.lb_member_1_subnet = result['subnet']
448 LOG.info('lb_member_1_subnet: {}'.format(cls.lb_member_1_subnet))
449 cls.addClassResourceCleanup(
450 waiters.wait_for_not_found,
451 cls.lb_mem_subnet_client.delete_subnet,
452 cls.lb_mem_subnet_client.show_subnet,
453 cls.lb_member_1_subnet['id'])
454
455 # Create tenant member 1 ipv6 subnet
456 if CONF.load_balancer.test_with_ipv6:
457 subnet_kwargs = {
458 'name': data_utils.rand_name("lb_member_1_ipv6_subnet"),
459 'network_id': cls.lb_member_1_net['id'],
460 'cidr': CONF.load_balancer.member_1_ipv6_subnet_cidr,
461 'ip_version': 6}
462 result = cls.lb_mem_subnet_client.create_subnet(**subnet_kwargs)
463 cls.lb_member_1_ipv6_subnet = result['subnet']
464 LOG.info('lb_member_1_ipv6_subnet: {}'.format(
465 cls.lb_member_1_ipv6_subnet))
466 cls.addClassResourceCleanup(
467 waiters.wait_for_not_found,
468 cls.lb_mem_subnet_client.delete_subnet,
469 cls.lb_mem_subnet_client.show_subnet,
470 cls.lb_member_1_ipv6_subnet['id'])
471
472 # Create tenant member 2 network
473 network_kwargs = {
474 'name': data_utils.rand_name("lb_member_2_network")}
475 if CONF.network_feature_enabled.port_security:
476 if CONF.load_balancer.enable_security_groups:
477 network_kwargs['port_security_enabled'] = True
478 else:
479 network_kwargs['port_security_enabled'] = False
480 result = cls.lb_mem_net_client.create_network(**network_kwargs)
481 cls.lb_member_2_net = result['network']
482 LOG.info('lb_member_2_net: {}'.format(cls.lb_member_2_net))
483 cls.addClassResourceCleanup(
484 waiters.wait_for_not_found,
485 cls.lb_mem_net_client.delete_network,
486 cls.lb_mem_net_client.show_network,
487 cls.lb_member_2_net['id'])
488
489 # Create tenant member 2 subnet
490 subnet_kwargs = {
491 'name': data_utils.rand_name("lb_member_2_subnet"),
492 'network_id': cls.lb_member_2_net['id'],
493 'cidr': CONF.load_balancer.member_2_ipv4_subnet_cidr,
494 'ip_version': 4}
495 result = cls.lb_mem_subnet_client.create_subnet(**subnet_kwargs)
496 cls.lb_member_2_subnet = result['subnet']
497 LOG.info('lb_member_2_subnet: {}'.format(cls.lb_member_2_subnet))
498 cls.addClassResourceCleanup(
499 waiters.wait_for_not_found,
500 cls.lb_mem_subnet_client.delete_subnet,
501 cls.lb_mem_subnet_client.show_subnet,
502 cls.lb_member_2_subnet['id'])
503
504 # Create tenant member 2 ipv6 subnet
505 if CONF.load_balancer.test_with_ipv6:
506 subnet_kwargs = {
507 'name': data_utils.rand_name("lb_member_2_ipv6_subnet"),
508 'network_id': cls.lb_member_2_net['id'],
509 'cidr': CONF.load_balancer.member_2_ipv6_subnet_cidr,
510 'ip_version': 6}
511 result = cls.lb_mem_subnet_client.create_subnet(**subnet_kwargs)
512 cls.lb_member_2_ipv6_subnet = result['subnet']
513 LOG.info('lb_member_2_ipv6_subnet: {}'.format(
514 cls.lb_member_2_ipv6_subnet))
515 cls.addClassResourceCleanup(
516 waiters.wait_for_not_found,
517 cls.lb_mem_subnet_client.delete_subnet,
518 cls.lb_mem_subnet_client.show_subnet,
519 cls.lb_member_2_ipv6_subnet['id'])
520
521 # Create a router for the subnets (required for the floating IP)
522 router_name = data_utils.rand_name("lb_member_router")
523 result = cls.lb_mem_routers_client.create_router(
524 name=router_name, admin_state_up=True,
525 external_gateway_info=dict(
526 network_id=CONF.network.public_network_id))
527 cls.lb_member_router = result['router']
528 LOG.info('lb_member_router: {}'.format(cls.lb_member_router))
529 cls.addClassResourceCleanup(
530 waiters.wait_for_not_found,
531 cls.lb_mem_routers_client.delete_router,
532 cls.lb_mem_routers_client.show_router,
533 cls.lb_member_router['id'])
534
535 # Add VIP subnet to router
536 cls.lb_mem_routers_client.add_router_interface(
537 cls.lb_member_router['id'],
538 subnet_id=cls.lb_member_vip_subnet['id'])
539 cls.addClassResourceCleanup(
540 waiters.wait_for_not_found,
541 cls.lb_mem_routers_client.remove_router_interface,
542 cls.lb_mem_routers_client.remove_router_interface,
543 cls.lb_member_router['id'],
544 subnet_id=cls.lb_member_vip_subnet['id'])
545
546 # Add member subnet 1 to router
547 cls.lb_mem_routers_client.add_router_interface(
548 cls.lb_member_router['id'],
549 subnet_id=cls.lb_member_1_subnet['id'])
550 cls.addClassResourceCleanup(
551 waiters.wait_for_not_found,
Jude Cross986e3f52017-07-24 14:57:20 -0700552 cls.lb_mem_routers_client.remove_router_interface,
553 cls.lb_mem_routers_client.remove_router_interface,
554 cls.lb_member_router['id'], subnet_id=cls.lb_member_1_subnet['id'])
555
556 # Add member subnet 2 to router
557 cls.lb_mem_routers_client.add_router_interface(
558 cls.lb_member_router['id'],
559 subnet_id=cls.lb_member_2_subnet['id'])
560 cls.addClassResourceCleanup(
561 waiters.wait_for_not_found,
562 cls.lb_mem_routers_client.remove_router_interface,
563 cls.lb_mem_routers_client.remove_router_interface,
564 cls.lb_member_router['id'], subnet_id=cls.lb_member_2_subnet['id'])
565
566 @classmethod
567 def _create_webserver(cls, name, network):
568 """Creates a webserver with two ports.
569
570 webserver_details dictionary contains:
571 server - The compute server object
572 ipv4_address - The IPv4 address for the server (optional)
573 ipv6_address - The IPv6 address for the server (optional)
574 public_ipv4_address - The publicly accessible IPv4 address for the
575 server, this may be a floating IP (optional)
576
577 :param name: The name of the server to create.
578 :param network: The network to boot the server on.
579 :returns: webserver_details dictionary.
580 """
581 server_kwargs = {
582 'name': data_utils.rand_name(name),
583 'flavorRef': CONF.compute.flavor_ref,
584 'imageRef': CONF.compute.image_ref,
585 'key_name': cls.lb_member_keypair['name']}
586 if (CONF.load_balancer.enable_security_groups and
587 CONF.network_feature_enabled.port_security):
588 server_kwargs['security_groups'] = [
589 {'name': cls.lb_member_sec_group['name']}]
590 if not CONF.load_balancer.disable_boot_network:
591 server_kwargs['networks'] = [{'uuid': network['id']}]
592
593 # Replace the name for clouds that have limitations
594 if CONF.load_balancer.random_server_name_length:
595 r = random.SystemRandom()
596 server_kwargs['name'] = "m{}".format("".join(
597 [r.choice(string.ascii_uppercase + string.digits)
598 for _ in range(
599 CONF.load_balancer.random_server_name_length - 1)]
600 ))
601 if CONF.load_balancer.availability_zone:
602 server_kwargs['availability_zone'] = (
603 CONF.load_balancer.availability_zone)
604
605 server = cls.lb_mem_servers_client.create_server(
606 **server_kwargs)['server']
607 cls.addClassResourceCleanup(
608 waiters.wait_for_not_found,
609 cls.lb_mem_servers_client.delete_server,
610 cls.lb_mem_servers_client.show_server,
611 server['id'])
612 server = waiters.wait_for_status(
613 cls.lb_mem_servers_client.show_server,
614 server['id'], 'status', 'ACTIVE',
615 CONF.load_balancer.build_interval,
616 CONF.load_balancer.build_timeout,
617 root_tag='server')
618 webserver_details = {'server': server}
619 LOG.info('Created server: {}'.format(server))
620
621 addresses = server['addresses']
622 if CONF.load_balancer.disable_boot_network:
623 instance_network = addresses.values()[0]
624 else:
625 instance_network = addresses[network['name']]
626 for addr in instance_network:
627 if addr['version'] == 4:
628 webserver_details['ipv4_address'] = addr['addr']
629 if addr['version'] == 6:
630 webserver_details['ipv6_address'] = addr['addr']
631
632 if CONF.validation.connect_method == 'floating':
633 result = cls.lb_mem_ports_client.list_ports(
634 network_id=network['id'],
635 mac_address=instance_network[0]['OS-EXT-IPS-MAC:mac_addr'])
636 port_id = result['ports'][0]['id']
637 result = cls.lb_mem_float_ip_client.create_floatingip(
638 floating_network_id=CONF.network.public_network_id,
639 port_id=port_id)
640 floating_ip = result['floatingip']
641 LOG.info('webserver1_floating_ip: {}'.format(floating_ip))
642 cls.addClassResourceCleanup(
643 waiters.wait_for_not_found,
644 cls.lb_mem_float_ip_client.delete_floatingip,
645 cls.lb_mem_float_ip_client.show_floatingip,
646 floatingip_id=floating_ip['id'])
647 webserver_details['public_ipv4_address'] = (
648 floating_ip['floating_ip_address'])
649 else:
650 webserver_details['public_ipv4_address'] = (
651 instance_network[0]['addr'])
652
653 return webserver_details
654
655 @classmethod
656 def _validate_webserver(cls, ip_address, start_id):
657 URL = 'http://{0}'.format(ip_address)
658 validators.validate_URL_response(URL, expected_body=str(start_id))
659 URL = 'http://{0}:81'.format(ip_address)
660 validators.validate_URL_response(URL, expected_body=str(start_id + 1))
661
662 @classmethod
663 def _setup_lb_network_kwargs(cls, lb_kwargs, ip_version):
664 if cls.lb_member_vip_subnet:
665 ip_index = data_utils.rand_int_id(start=10, end=100)
666 if ip_version == 4:
667 network = ipaddress.IPv4Network(
668 six.u(CONF.load_balancer.vip_subnet_cidr))
669 lb_vip_address = str(network[ip_index])
670 subnet_id = cls.lb_member_vip_subnet[const.ID]
671 else:
672 network = ipaddress.IPv6Network(
673 six.u(CONF.load_balancer.vip_ipv6_subnet_cidr))
674 lb_vip_address = str(network[ip_index])
675 subnet_id = cls.lb_member_vip_ipv6_subnet[const.ID]
676 lb_kwargs[const.VIP_SUBNET_ID] = subnet_id
677 lb_kwargs[const.VIP_ADDRESS] = lb_vip_address
678 if CONF.load_balancer.test_with_noop:
679 lb_kwargs[const.VIP_NETWORK_ID] = (
680 cls.lb_member_vip_net[const.ID])
681 else:
682 lb_kwargs[const.VIP_NETWORK_ID] = cls.lb_member_vip_net[const.ID]
683 lb_kwargs[const.VIP_SUBNET_ID] = None