Merge "Remove tests requiring Neutron LBaaS"
This commit is contained in:
commit
87eb0e9d79
@ -1,159 +0,0 @@
|
|||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
|
|
||||||
from tempest.lib import decorators
|
|
||||||
|
|
||||||
from heat_tempest_plugin.tests.functional import functional_base
|
|
||||||
|
|
||||||
|
|
||||||
class LoadBalancerv2Test(functional_base.FunctionalTestsBase):
|
|
||||||
|
|
||||||
create_template = '''
|
|
||||||
heat_template_version: 2016-04-08
|
|
||||||
parameters:
|
|
||||||
subnet:
|
|
||||||
type: string
|
|
||||||
resources:
|
|
||||||
loadbalancer:
|
|
||||||
type: OS::Neutron::LBaaS::LoadBalancer
|
|
||||||
properties:
|
|
||||||
description: aLoadBalancer
|
|
||||||
vip_subnet: { get_param: subnet }
|
|
||||||
listener:
|
|
||||||
type: OS::Neutron::LBaaS::Listener
|
|
||||||
properties:
|
|
||||||
description: aListener
|
|
||||||
loadbalancer: { get_resource: loadbalancer }
|
|
||||||
protocol: HTTP
|
|
||||||
protocol_port: 80
|
|
||||||
connection_limit: 5555
|
|
||||||
pool:
|
|
||||||
type: OS::Neutron::LBaaS::Pool
|
|
||||||
properties:
|
|
||||||
description: aPool
|
|
||||||
lb_algorithm: ROUND_ROBIN
|
|
||||||
protocol: HTTP
|
|
||||||
listener: { get_resource: listener }
|
|
||||||
poolmember:
|
|
||||||
type: OS::Neutron::LBaaS::PoolMember
|
|
||||||
properties:
|
|
||||||
address: 1.1.1.1
|
|
||||||
pool: { get_resource: pool }
|
|
||||||
protocol_port: 1111
|
|
||||||
subnet: { get_param: subnet }
|
|
||||||
weight: 255
|
|
||||||
# pm2
|
|
||||||
healthmonitor:
|
|
||||||
type: OS::Neutron::LBaaS::HealthMonitor
|
|
||||||
properties:
|
|
||||||
delay: 3
|
|
||||||
type: HTTP
|
|
||||||
timeout: 3
|
|
||||||
max_retries: 3
|
|
||||||
pool: { get_resource: pool }
|
|
||||||
outputs:
|
|
||||||
loadbalancer:
|
|
||||||
value: { get_attr: [ loadbalancer, show ] }
|
|
||||||
pool:
|
|
||||||
value: { get_attr: [ pool, show ] }
|
|
||||||
poolmember:
|
|
||||||
value: { get_attr: [ poolmember, show ] }
|
|
||||||
listener:
|
|
||||||
value: { get_attr: [ listener, show ] }
|
|
||||||
healthmonitor:
|
|
||||||
value: { get_attr: [ healthmonitor, show ] }
|
|
||||||
'''
|
|
||||||
|
|
||||||
add_member = '''
|
|
||||||
poolmember2:
|
|
||||||
type: OS::Neutron::LBaaS::PoolMember
|
|
||||||
properties:
|
|
||||||
address: 2.2.2.2
|
|
||||||
pool: { get_resource: pool }
|
|
||||||
protocol_port: 2222
|
|
||||||
subnet: { get_param: subnet }
|
|
||||||
weight: 222
|
|
||||||
'''
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(LoadBalancerv2Test, self).setUp()
|
|
||||||
if not self.is_network_extension_supported('lbaasv2'):
|
|
||||||
self.skipTest('LBaasv2 extension not available, skipping')
|
|
||||||
|
|
||||||
@decorators.idempotent_id('2f4a476c-cba7-448b-a7c1-85f7284f0293')
|
|
||||||
def test_create_update_loadbalancer(self):
|
|
||||||
parameters = {
|
|
||||||
'subnet': self.conf.fixed_subnet_name,
|
|
||||||
}
|
|
||||||
stack_identifier = self.stack_create(template=self.create_template,
|
|
||||||
parameters=parameters)
|
|
||||||
stack = self.client.stacks.get(stack_identifier)
|
|
||||||
output = self._stack_output(stack, 'loadbalancer')
|
|
||||||
self.assertEqual('ONLINE', output['operating_status'])
|
|
||||||
|
|
||||||
template = self.create_template.replace('ROUND_ROBIN', 'SOURCE_IP')
|
|
||||||
template = template.replace('3', '6')
|
|
||||||
template = template.replace('255', '256')
|
|
||||||
template = template.replace('5555', '7777')
|
|
||||||
template = template.replace('aLoadBalancer', 'updatedLoadBalancer')
|
|
||||||
template = template.replace('aPool', 'updatedPool')
|
|
||||||
template = template.replace('aListener', 'updatedListener')
|
|
||||||
self.update_stack(stack_identifier, template=template,
|
|
||||||
parameters=parameters)
|
|
||||||
stack = self.client.stacks.get(stack_identifier)
|
|
||||||
|
|
||||||
output = self._stack_output(stack, 'loadbalancer')
|
|
||||||
self.assertEqual('ONLINE', output['operating_status'])
|
|
||||||
self.assertEqual('updatedLoadBalancer', output['description'])
|
|
||||||
output = self._stack_output(stack, 'pool')
|
|
||||||
self.assertEqual('SOURCE_IP', output['lb_algorithm'])
|
|
||||||
self.assertEqual('updatedPool', output['description'])
|
|
||||||
output = self._stack_output(stack, 'poolmember')
|
|
||||||
self.assertEqual(256, output['weight'])
|
|
||||||
output = self._stack_output(stack, 'healthmonitor')
|
|
||||||
self.assertEqual(6, output['delay'])
|
|
||||||
self.assertEqual(6, output['timeout'])
|
|
||||||
self.assertEqual(6, output['max_retries'])
|
|
||||||
output = self._stack_output(stack, 'listener')
|
|
||||||
self.assertEqual(7777, output['connection_limit'])
|
|
||||||
self.assertEqual('updatedListener', output['description'])
|
|
||||||
|
|
||||||
@decorators.idempotent_id('104f59ae-a3c8-4c12-98e5-a7bc0007878d')
|
|
||||||
def test_add_delete_poolmember(self):
|
|
||||||
parameters = {
|
|
||||||
'subnet': self.conf.fixed_subnet_name,
|
|
||||||
}
|
|
||||||
stack_identifier = self.stack_create(template=self.create_template,
|
|
||||||
parameters=parameters)
|
|
||||||
stack = self.client.stacks.get(stack_identifier)
|
|
||||||
output = self._stack_output(stack, 'loadbalancer')
|
|
||||||
self.assertEqual('ONLINE', output['operating_status'])
|
|
||||||
output = self._stack_output(stack, 'pool')
|
|
||||||
self.assertEqual(1, len(output['members']))
|
|
||||||
# add pool member
|
|
||||||
template = self.create_template.replace('# pm2', self.add_member)
|
|
||||||
self.update_stack(stack_identifier, template=template,
|
|
||||||
parameters=parameters)
|
|
||||||
stack = self.client.stacks.get(stack_identifier)
|
|
||||||
output = self._stack_output(stack, 'loadbalancer')
|
|
||||||
self.assertEqual('ONLINE', output['operating_status'])
|
|
||||||
output = self._stack_output(stack, 'pool')
|
|
||||||
self.assertEqual(2, len(output['members']))
|
|
||||||
# delete pool member
|
|
||||||
self.update_stack(stack_identifier, template=self.create_template,
|
|
||||||
parameters=parameters)
|
|
||||||
stack = self.client.stacks.get(stack_identifier)
|
|
||||||
output = self._stack_output(stack, 'loadbalancer')
|
|
||||||
self.assertEqual('ONLINE', output['operating_status'])
|
|
||||||
output = self._stack_output(stack, 'pool')
|
|
||||||
self.assertEqual(1, len(output['members']))
|
|
@ -1,76 +0,0 @@
|
|||||||
heat_template_version: 2015-10-15
|
|
||||||
|
|
||||||
description: |
|
|
||||||
App server that is a member of Neutron Pool.
|
|
||||||
|
|
||||||
parameters:
|
|
||||||
|
|
||||||
image:
|
|
||||||
type: string
|
|
||||||
|
|
||||||
flavor:
|
|
||||||
type: string
|
|
||||||
|
|
||||||
net:
|
|
||||||
type: string
|
|
||||||
|
|
||||||
sec_group:
|
|
||||||
type: string
|
|
||||||
|
|
||||||
pool:
|
|
||||||
type: string
|
|
||||||
|
|
||||||
app_port:
|
|
||||||
type: number
|
|
||||||
|
|
||||||
timeout:
|
|
||||||
type: number
|
|
||||||
|
|
||||||
subnet:
|
|
||||||
type: string
|
|
||||||
|
|
||||||
wc_extra_args:
|
|
||||||
type: string
|
|
||||||
default: ""
|
|
||||||
|
|
||||||
resources:
|
|
||||||
|
|
||||||
config:
|
|
||||||
type: OS::Test::WebAppConfig
|
|
||||||
properties:
|
|
||||||
app_port: { get_param: app_port }
|
|
||||||
wc_curl_cli:
|
|
||||||
list_join:
|
|
||||||
- " "
|
|
||||||
- [ get_attr: [ handle, curl_cli ], get_param: wc_extra_args ]
|
|
||||||
|
|
||||||
server:
|
|
||||||
type: OS::Nova::Server
|
|
||||||
properties:
|
|
||||||
image: { get_param: image }
|
|
||||||
flavor: { get_param: flavor }
|
|
||||||
networks:
|
|
||||||
- network: { get_param: net }
|
|
||||||
security_groups:
|
|
||||||
- { get_param: sec_group }
|
|
||||||
user_data_format: RAW
|
|
||||||
user_data: { get_resource: config }
|
|
||||||
|
|
||||||
handle:
|
|
||||||
type: OS::Heat::WaitConditionHandle
|
|
||||||
|
|
||||||
waiter:
|
|
||||||
type: OS::Heat::WaitCondition
|
|
||||||
depends_on: server
|
|
||||||
properties:
|
|
||||||
timeout: { get_param: timeout }
|
|
||||||
handle: { get_resource: handle }
|
|
||||||
|
|
||||||
pool_member:
|
|
||||||
type: OS::Neutron::LBaaS::PoolMember
|
|
||||||
depends_on: waiter
|
|
||||||
properties:
|
|
||||||
address: { get_attr: [ server, networks, { get_param: net }, 0 ] }
|
|
||||||
pool: { get_param: pool }
|
|
||||||
protocol_port: { get_param: app_port }
|
|
||||||
subnet: { get_param: subnet }
|
|
@ -1,69 +0,0 @@
|
|||||||
heat_template_version: pike
|
|
||||||
parameters:
|
|
||||||
image:
|
|
||||||
type: string
|
|
||||||
flavor:
|
|
||||||
type: string
|
|
||||||
network:
|
|
||||||
type: string
|
|
||||||
sec_group:
|
|
||||||
type: string
|
|
||||||
pool:
|
|
||||||
type: string
|
|
||||||
app_port:
|
|
||||||
type: number
|
|
||||||
timeout:
|
|
||||||
type: number
|
|
||||||
default: 120
|
|
||||||
subnet:
|
|
||||||
type: string
|
|
||||||
|
|
||||||
resources:
|
|
||||||
server:
|
|
||||||
type: OS::Nova::Server
|
|
||||||
properties:
|
|
||||||
image: {get_param: image}
|
|
||||||
flavor: {get_param: flavor}
|
|
||||||
networks:
|
|
||||||
- network: {get_param: network}
|
|
||||||
security_groups:
|
|
||||||
- {get_param: sec_group}
|
|
||||||
user_data_format: RAW
|
|
||||||
user_data:
|
|
||||||
str_replace:
|
|
||||||
template: |
|
|
||||||
#! /bin/sh -v
|
|
||||||
Body=$(hostname)
|
|
||||||
Response="HTTP/1.1 200 OK\r\nContent-Length: ${#Body}\r\n\r\n$Body"
|
|
||||||
while true; do
|
|
||||||
wc_notify --data-binary '{"status": "SUCCESS"}'
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
sleep 10
|
|
||||||
done
|
|
||||||
while true ; do
|
|
||||||
echo -e $Response | nc -llp PORT
|
|
||||||
done
|
|
||||||
params:
|
|
||||||
PORT: {get_param: app_port}
|
|
||||||
wc_notify: { get_attr: [handle, curl_cli]}
|
|
||||||
|
|
||||||
handle:
|
|
||||||
type: OS::Heat::WaitConditionHandle
|
|
||||||
|
|
||||||
waiter:
|
|
||||||
type: OS::Heat::WaitCondition
|
|
||||||
depends_on: server
|
|
||||||
properties:
|
|
||||||
timeout: {get_param: timeout}
|
|
||||||
handle: {get_resource: handle}
|
|
||||||
|
|
||||||
pool_member:
|
|
||||||
type: OS::Octavia::PoolMember
|
|
||||||
depends_on: waiter
|
|
||||||
properties:
|
|
||||||
address: {get_attr: [server, networks, {get_param: network}, 0]}
|
|
||||||
pool: {get_param: pool}
|
|
||||||
protocol_port: {get_param: app_port}
|
|
||||||
subnet: {get_param: subnet}
|
|
@ -1,117 +0,0 @@
|
|||||||
heat_template_version: 2015-04-30
|
|
||||||
|
|
||||||
description: |
|
|
||||||
Template which tests Neutron load balancing requests to members of
|
|
||||||
Heat AutoScalingGroup.
|
|
||||||
Instances must be running some webserver on a given app_port
|
|
||||||
producing HTTP response that is different between servers
|
|
||||||
but stable over time for given server.
|
|
||||||
|
|
||||||
parameters:
|
|
||||||
flavor:
|
|
||||||
type: string
|
|
||||||
image:
|
|
||||||
type: string
|
|
||||||
net:
|
|
||||||
type: string
|
|
||||||
subnet:
|
|
||||||
type: string
|
|
||||||
public_net:
|
|
||||||
type: string
|
|
||||||
app_port:
|
|
||||||
type: number
|
|
||||||
default: 8080
|
|
||||||
lb_port:
|
|
||||||
type: number
|
|
||||||
default: 80
|
|
||||||
timeout:
|
|
||||||
type: number
|
|
||||||
default: 600
|
|
||||||
wc_extra_args:
|
|
||||||
type: string
|
|
||||||
default: ""
|
|
||||||
|
|
||||||
resources:
|
|
||||||
|
|
||||||
sec_group:
|
|
||||||
type: OS::Neutron::SecurityGroup
|
|
||||||
properties:
|
|
||||||
rules:
|
|
||||||
- remote_ip_prefix: 0.0.0.0/0
|
|
||||||
protocol: tcp
|
|
||||||
port_range_min: { get_param: app_port }
|
|
||||||
port_range_max: { get_param: app_port }
|
|
||||||
|
|
||||||
asg:
|
|
||||||
type: OS::Heat::AutoScalingGroup
|
|
||||||
properties:
|
|
||||||
desired_capacity: 1
|
|
||||||
max_size: 2
|
|
||||||
min_size: 1
|
|
||||||
resource:
|
|
||||||
type: OS::Test::NeutronAppServer
|
|
||||||
properties:
|
|
||||||
image: { get_param: image }
|
|
||||||
flavor: { get_param: flavor }
|
|
||||||
net: { get_param: net}
|
|
||||||
sec_group: { get_resource: sec_group }
|
|
||||||
app_port: { get_param: app_port }
|
|
||||||
pool_id: { get_resource: pool }
|
|
||||||
timeout: { get_param: timeout }
|
|
||||||
wc_extra_args: { get_param: wc_extra_args }
|
|
||||||
|
|
||||||
scale_up:
|
|
||||||
type: OS::Heat::ScalingPolicy
|
|
||||||
properties:
|
|
||||||
adjustment_type: change_in_capacity
|
|
||||||
auto_scaling_group_id: { get_resource: asg }
|
|
||||||
scaling_adjustment: 1
|
|
||||||
|
|
||||||
scale_down:
|
|
||||||
type: OS::Heat::ScalingPolicy
|
|
||||||
properties:
|
|
||||||
adjustment_type: change_in_capacity
|
|
||||||
auto_scaling_group_id: { get_resource: asg }
|
|
||||||
scaling_adjustment: -1
|
|
||||||
|
|
||||||
health_monitor:
|
|
||||||
type: OS::Neutron::HealthMonitor
|
|
||||||
properties:
|
|
||||||
delay: 3
|
|
||||||
type: HTTP
|
|
||||||
timeout: 3
|
|
||||||
max_retries: 3
|
|
||||||
|
|
||||||
pool:
|
|
||||||
type: OS::Neutron::Pool
|
|
||||||
properties:
|
|
||||||
lb_method: ROUND_ROBIN
|
|
||||||
protocol: HTTP
|
|
||||||
subnet: { get_param: subnet }
|
|
||||||
monitors:
|
|
||||||
- { get_resource: health_monitor }
|
|
||||||
vip:
|
|
||||||
protocol_port: { get_param: lb_port }
|
|
||||||
|
|
||||||
floating_ip:
|
|
||||||
type: OS::Neutron::FloatingIP
|
|
||||||
properties:
|
|
||||||
floating_network: { get_param: public_net }
|
|
||||||
port_id:
|
|
||||||
{ get_attr: [pool, vip, 'port_id'] }
|
|
||||||
|
|
||||||
loadbalancer:
|
|
||||||
type: OS::Neutron::LoadBalancer
|
|
||||||
properties:
|
|
||||||
pool_id: { get_resource: pool }
|
|
||||||
protocol_port: { get_param: app_port }
|
|
||||||
|
|
||||||
outputs:
|
|
||||||
lburl:
|
|
||||||
description: URL of the loadbalanced app
|
|
||||||
value:
|
|
||||||
str_replace:
|
|
||||||
template: http://IP_ADDRESS:PORT
|
|
||||||
params:
|
|
||||||
IP_ADDRESS: { get_attr: [ floating_ip, floating_ip_address ] }
|
|
||||||
PORT: { get_param: lb_port }
|
|
@ -1,120 +0,0 @@
|
|||||||
heat_template_version: 2015-04-30
|
|
||||||
|
|
||||||
description: |
|
|
||||||
Template which tests Neutron load balancing requests to members of
|
|
||||||
Heat AutoScalingGroup. This uses LBaas V2.
|
|
||||||
Instances must be running some webserver on a given app_port
|
|
||||||
producing HTTP response that is different between servers
|
|
||||||
but stable over time for given server.
|
|
||||||
|
|
||||||
parameters:
|
|
||||||
flavor:
|
|
||||||
type: string
|
|
||||||
image:
|
|
||||||
type: string
|
|
||||||
net:
|
|
||||||
type: string
|
|
||||||
subnet:
|
|
||||||
type: string
|
|
||||||
public_net:
|
|
||||||
type: string
|
|
||||||
app_port:
|
|
||||||
type: number
|
|
||||||
default: 8080
|
|
||||||
lb_port:
|
|
||||||
type: number
|
|
||||||
default: 80
|
|
||||||
timeout:
|
|
||||||
type: number
|
|
||||||
default: 600
|
|
||||||
wc_extra_args:
|
|
||||||
type: string
|
|
||||||
default: ""
|
|
||||||
|
|
||||||
resources:
|
|
||||||
|
|
||||||
sec_group:
|
|
||||||
type: OS::Neutron::SecurityGroup
|
|
||||||
properties:
|
|
||||||
rules:
|
|
||||||
- remote_ip_prefix: 0.0.0.0/0
|
|
||||||
protocol: tcp
|
|
||||||
port_range_min: { get_param: app_port }
|
|
||||||
port_range_max: { get_param: app_port }
|
|
||||||
|
|
||||||
asg:
|
|
||||||
type: OS::Heat::AutoScalingGroup
|
|
||||||
properties:
|
|
||||||
desired_capacity: 1
|
|
||||||
max_size: 2
|
|
||||||
min_size: 1
|
|
||||||
resource:
|
|
||||||
type: OS::Test::NeutronAppServer
|
|
||||||
properties:
|
|
||||||
image: { get_param: image }
|
|
||||||
flavor: { get_param: flavor }
|
|
||||||
net: { get_param: net}
|
|
||||||
sec_group: { get_resource: sec_group }
|
|
||||||
app_port: { get_param: app_port }
|
|
||||||
pool: { get_resource: pool }
|
|
||||||
subnet: { get_param: subnet }
|
|
||||||
timeout: { get_param: timeout }
|
|
||||||
wc_extra_args: { get_param: wc_extra_args }
|
|
||||||
|
|
||||||
scale_up:
|
|
||||||
type: OS::Heat::ScalingPolicy
|
|
||||||
properties:
|
|
||||||
adjustment_type: change_in_capacity
|
|
||||||
auto_scaling_group_id: { get_resource: asg }
|
|
||||||
scaling_adjustment: 1
|
|
||||||
|
|
||||||
scale_down:
|
|
||||||
type: OS::Heat::ScalingPolicy
|
|
||||||
properties:
|
|
||||||
adjustment_type: change_in_capacity
|
|
||||||
auto_scaling_group_id: { get_resource: asg }
|
|
||||||
scaling_adjustment: -1
|
|
||||||
|
|
||||||
health_monitor:
|
|
||||||
type: OS::Neutron::LBaaS::HealthMonitor
|
|
||||||
properties:
|
|
||||||
delay: 3
|
|
||||||
type: HTTP
|
|
||||||
timeout: 3
|
|
||||||
max_retries: 3
|
|
||||||
pool: { get_resource: pool }
|
|
||||||
|
|
||||||
pool:
|
|
||||||
type: OS::Neutron::LBaaS::Pool
|
|
||||||
properties:
|
|
||||||
lb_algorithm: ROUND_ROBIN
|
|
||||||
protocol: HTTP
|
|
||||||
listener: { get_resource: listener }
|
|
||||||
|
|
||||||
listener:
|
|
||||||
type: OS::Neutron::LBaaS::Listener
|
|
||||||
properties:
|
|
||||||
loadbalancer: { get_resource: loadbalancer }
|
|
||||||
protocol: HTTP
|
|
||||||
protocol_port: { get_param: lb_port }
|
|
||||||
|
|
||||||
loadbalancer:
|
|
||||||
type: OS::Neutron::LBaaS::LoadBalancer
|
|
||||||
properties:
|
|
||||||
vip_subnet: { get_param: subnet }
|
|
||||||
|
|
||||||
floating_ip:
|
|
||||||
type: OS::Neutron::FloatingIP
|
|
||||||
properties:
|
|
||||||
floating_network: { get_param: public_net }
|
|
||||||
port_id: { get_attr: [loadbalancer, vip_port_id] }
|
|
||||||
|
|
||||||
outputs:
|
|
||||||
lburl:
|
|
||||||
description: URL of the loadbalanced app
|
|
||||||
value:
|
|
||||||
str_replace:
|
|
||||||
template: http://IP_ADDRESS:PORT
|
|
||||||
params:
|
|
||||||
IP_ADDRESS: { get_attr: [ floating_ip, floating_ip_address ] }
|
|
||||||
PORT: { get_param: lb_port }
|
|
@ -1,114 +0,0 @@
|
|||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
import time
|
|
||||||
|
|
||||||
import requests
|
|
||||||
from tempest.lib import decorators
|
|
||||||
|
|
||||||
from heat_tempest_plugin.common import test
|
|
||||||
from heat_tempest_plugin.tests.scenario import scenario_base
|
|
||||||
|
|
||||||
|
|
||||||
class AutoscalingLoadBalancerTest(scenario_base.ScenarioTestsBase):
|
|
||||||
"""The class is responsible for testing ASG + LBv1 scenario.
|
|
||||||
|
|
||||||
The very common use case tested is an autoscaling group
|
|
||||||
of some web application servers behind a loadbalancer.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(AutoscalingLoadBalancerTest, self).setUp()
|
|
||||||
self.template_name = 'test_autoscaling_lb_neutron.yaml'
|
|
||||||
self.app_server_template_name = 'app_server_neutron.yaml'
|
|
||||||
self.webapp_template_name = 'netcat-webapp.yaml'
|
|
||||||
if not self.is_network_extension_supported('lbaas'):
|
|
||||||
self.skipTest('LBaas v1 extension not available, skipping')
|
|
||||||
|
|
||||||
def check_num_responses(self, url, expected_num, retries=10):
|
|
||||||
resp = set()
|
|
||||||
for count in range(retries):
|
|
||||||
time.sleep(1)
|
|
||||||
try:
|
|
||||||
r = requests.get(url, verify=self.verify_cert)
|
|
||||||
except requests.exceptions.ConnectionError:
|
|
||||||
# The LB may not be up yet, let's retry
|
|
||||||
continue
|
|
||||||
# skip unsuccessful requests
|
|
||||||
if r.status_code == 200:
|
|
||||||
resp.add(r.text)
|
|
||||||
self.assertEqual(expected_num, len(resp))
|
|
||||||
|
|
||||||
@decorators.idempotent_id('48ddbc45-cef6-4640-acd6-7efc281833b9')
|
|
||||||
def test_autoscaling_loadbalancer_neutron(self):
|
|
||||||
"""Check work of AutoScaing and Neutron LBaaS v1 resource in Heat.
|
|
||||||
|
|
||||||
The scenario is the following:
|
|
||||||
1. Launch a stack with a load balancer and autoscaling group
|
|
||||||
of one server, wait until stack create is complete.
|
|
||||||
2. Check that there is only one distinctive response from
|
|
||||||
loadbalanced IP.
|
|
||||||
3. Signal the scale_up policy, wait until all resources in
|
|
||||||
autoscaling group are complete.
|
|
||||||
4. Check that now there are two distinctive responses from
|
|
||||||
loadbalanced IP.
|
|
||||||
"""
|
|
||||||
|
|
||||||
parameters = {
|
|
||||||
'flavor': self.conf.minimal_instance_type,
|
|
||||||
'image': self.conf.minimal_image_ref,
|
|
||||||
'net': self.conf.fixed_network_name,
|
|
||||||
'subnet': self.conf.fixed_subnet_name,
|
|
||||||
'public_net': self.conf.floating_network_name,
|
|
||||||
'app_port': 8080,
|
|
||||||
'lb_port': 80,
|
|
||||||
'timeout': 600
|
|
||||||
}
|
|
||||||
if self.conf.vm_to_heat_api_insecure:
|
|
||||||
parameters['wc_extra_args'] = '--insecure'
|
|
||||||
|
|
||||||
app_server_template = self._load_template(
|
|
||||||
__file__, self.app_server_template_name, self.sub_dir
|
|
||||||
)
|
|
||||||
webapp_template = self._load_template(
|
|
||||||
__file__, self.webapp_template_name, self.sub_dir
|
|
||||||
)
|
|
||||||
files = {'appserver.yaml': app_server_template,
|
|
||||||
'webapp.yaml': webapp_template}
|
|
||||||
env = {'resource_registry':
|
|
||||||
{'OS::Test::NeutronAppServer': 'appserver.yaml',
|
|
||||||
'OS::Test::WebAppConfig': 'webapp.yaml'}}
|
|
||||||
# Launch stack
|
|
||||||
sid = self.launch_stack(
|
|
||||||
template_name=self.template_name,
|
|
||||||
parameters=parameters,
|
|
||||||
files=files,
|
|
||||||
environment=env
|
|
||||||
)
|
|
||||||
stack = self.client.stacks.get(sid)
|
|
||||||
lb_url = self._stack_output(stack, 'lburl')
|
|
||||||
# Check number of distinctive responces, must be 1
|
|
||||||
self.check_num_responses(lb_url, 1)
|
|
||||||
|
|
||||||
# Signal the scaling hook
|
|
||||||
self.client.resources.signal(sid, 'scale_up')
|
|
||||||
|
|
||||||
# Wait for AutoScalingGroup update to finish
|
|
||||||
asg = self.client.resources.get(sid, 'asg')
|
|
||||||
test.call_until_true(self.conf.build_timeout,
|
|
||||||
self.conf.build_interval,
|
|
||||||
self.check_autoscale_complete,
|
|
||||||
asg.physical_resource_id, 2, sid, 'asg')
|
|
||||||
|
|
||||||
# Check number of distinctive responses, must now be 2
|
|
||||||
self.check_num_responses(lb_url, 2)
|
|
@ -1,114 +0,0 @@
|
|||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
import time
|
|
||||||
|
|
||||||
import requests
|
|
||||||
from tempest.lib import decorators
|
|
||||||
|
|
||||||
from heat_tempest_plugin.common import test
|
|
||||||
from heat_tempest_plugin.tests.scenario import scenario_base
|
|
||||||
|
|
||||||
|
|
||||||
class AutoscalingLoadBalancerv2Test(scenario_base.ScenarioTestsBase):
|
|
||||||
"""The class is responsible for testing ASG + LBv2 scenario.
|
|
||||||
|
|
||||||
The very common use case tested is an autoscaling group
|
|
||||||
of some web application servers behind a loadbalancer.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(AutoscalingLoadBalancerv2Test, self).setUp()
|
|
||||||
self.template_name = 'test_autoscaling_lbv2_neutron.yaml'
|
|
||||||
self.app_server_template_name = 'app_server_lbv2_neutron.yaml'
|
|
||||||
self.webapp_template_name = 'netcat-webapp.yaml'
|
|
||||||
if not self.is_network_extension_supported('lbaasv2'):
|
|
||||||
self.skipTest('LBaasv2 extension not available, skipping')
|
|
||||||
|
|
||||||
def check_num_responses(self, url, expected_num, retries=20):
|
|
||||||
resp = set()
|
|
||||||
for count in range(retries):
|
|
||||||
time.sleep(2)
|
|
||||||
try:
|
|
||||||
r = requests.get(url, verify=self.verify_cert)
|
|
||||||
except requests.exceptions.ConnectionError:
|
|
||||||
# The LB may not be up yet, let's retry
|
|
||||||
continue
|
|
||||||
# skip unsuccessful requests
|
|
||||||
if r.status_code == 200:
|
|
||||||
resp.add(r.text)
|
|
||||||
if len(resp) == expected_num:
|
|
||||||
break
|
|
||||||
self.assertEqual(expected_num, len(resp))
|
|
||||||
|
|
||||||
@decorators.idempotent_id('89459930-aa61-4557-989b-3429d3b3b612')
|
|
||||||
def test_autoscaling_loadbalancer_neutron(self):
|
|
||||||
"""Check work of AutoScaing and Neutron LBaaS v2 resource in Heat.
|
|
||||||
|
|
||||||
The scenario is the following:
|
|
||||||
1. Launch a stack with a load balancer and autoscaling group
|
|
||||||
of one server, wait until stack create is complete.
|
|
||||||
2. Check that there is only one distinctive response from
|
|
||||||
loadbalanced IP.
|
|
||||||
3. Signal the scale_up policy, wait until all resources in
|
|
||||||
autoscaling group are complete.
|
|
||||||
4. Check that now there are two distinctive responses from
|
|
||||||
loadbalanced IP.
|
|
||||||
"""
|
|
||||||
|
|
||||||
parameters = {
|
|
||||||
'flavor': self.conf.minimal_instance_type,
|
|
||||||
'image': self.conf.minimal_image_ref,
|
|
||||||
'net': self.conf.fixed_network_name,
|
|
||||||
'subnet': self.conf.fixed_subnet_name,
|
|
||||||
'public_net': self.conf.floating_network_name
|
|
||||||
}
|
|
||||||
if self.conf.vm_to_heat_api_insecure:
|
|
||||||
parameters['wc_extra_args'] = '--insecure'
|
|
||||||
|
|
||||||
app_server_template = self._load_template(
|
|
||||||
__file__, self.app_server_template_name, self.sub_dir
|
|
||||||
)
|
|
||||||
webapp_template = self._load_template(
|
|
||||||
__file__, self.webapp_template_name, self.sub_dir
|
|
||||||
)
|
|
||||||
files = {'appserver.yaml': app_server_template,
|
|
||||||
'webapp.yaml': webapp_template}
|
|
||||||
env = {'resource_registry':
|
|
||||||
{'OS::Test::NeutronAppServer': 'appserver.yaml',
|
|
||||||
'OS::Test::WebAppConfig': 'webapp.yaml'}}
|
|
||||||
|
|
||||||
# Launch stack
|
|
||||||
sid = self.launch_stack(
|
|
||||||
template_name=self.template_name,
|
|
||||||
parameters=parameters,
|
|
||||||
files=files,
|
|
||||||
environment=env
|
|
||||||
)
|
|
||||||
stack = self.client.stacks.get(sid)
|
|
||||||
lb_url = self._stack_output(stack, 'lburl')
|
|
||||||
# Check number of distinctive responces, must be 1
|
|
||||||
self.check_num_responses(lb_url, 1)
|
|
||||||
|
|
||||||
# Signal the scaling hook
|
|
||||||
self.client.resources.signal(sid, 'scale_up')
|
|
||||||
|
|
||||||
# Wait for AutoScalingGroup update to finish
|
|
||||||
asg = self.client.resources.get(sid, 'asg')
|
|
||||||
test.call_until_true(self.conf.build_timeout,
|
|
||||||
self.conf.build_interval,
|
|
||||||
self.check_autoscale_complete,
|
|
||||||
asg.physical_resource_id, 2, sid, 'asg')
|
|
||||||
|
|
||||||
# Check number of distinctive responses, must now be 2
|
|
||||||
self.check_num_responses(lb_url, 2)
|
|
Loading…
Reference in New Issue
Block a user