Merge "tests: add an integration test"
This commit is contained in:
commit
465974bc3f
0
ceilometer/tests/integration/__init__.py
Normal file
0
ceilometer/tests/integration/__init__.py
Normal file
0
ceilometer/tests/integration/gabbi/__init__.py
Normal file
0
ceilometer/tests/integration/gabbi/__init__.py
Normal file
169
ceilometer/tests/integration/gabbi/gabbits-live/autoscaling.yaml
Normal file
169
ceilometer/tests/integration/gabbi/gabbits-live/autoscaling.yaml
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
defaults:
|
||||||
|
request_headers:
|
||||||
|
x-auth-token: $ENVIRON['ADMIN_TOKEN']
|
||||||
|
|
||||||
|
tests:
|
||||||
|
- name: list alarms none
|
||||||
|
desc: Lists alarms, none yet exist
|
||||||
|
url: $ENVIRON['AODH_SERVICE_URL']/v2/alarms
|
||||||
|
method: GET
|
||||||
|
response_strings:
|
||||||
|
- "[]"
|
||||||
|
|
||||||
|
- name: list servers none
|
||||||
|
desc: List servers, none yet exists
|
||||||
|
url: $ENVIRON['NOVA_SERVICE_URL']/servers
|
||||||
|
method: GET
|
||||||
|
response_strings:
|
||||||
|
- "[]"
|
||||||
|
|
||||||
|
- name: create stack
|
||||||
|
desc: Create an autoscaling stack
|
||||||
|
url: $ENVIRON['HEAT_SERVICE_URL']/stacks
|
||||||
|
method: POST
|
||||||
|
request_headers:
|
||||||
|
content-type: application/json
|
||||||
|
data:
|
||||||
|
stack_name: integration_test
|
||||||
|
template:
|
||||||
|
heat_template_version: "2013-05-23"
|
||||||
|
description: Integration Test AutoScaling with heat+ceilometer+gnocchi+aodh
|
||||||
|
resources:
|
||||||
|
asg:
|
||||||
|
type: OS::Heat::AutoScalingGroup
|
||||||
|
properties:
|
||||||
|
min_size: 1
|
||||||
|
max_size: 3
|
||||||
|
resource:
|
||||||
|
type: OS::Nova::Server
|
||||||
|
properties:
|
||||||
|
networks:
|
||||||
|
- network: "private"
|
||||||
|
flavor: m1.tiny
|
||||||
|
image: $ENVIRON['GLANCE_IMAGE_NAME']
|
||||||
|
metadata:
|
||||||
|
"metering.server_group": {get_param: "OS::stack_id"}
|
||||||
|
user_data_format: RAW
|
||||||
|
user_data: |
|
||||||
|
#!/bin/sh
|
||||||
|
echo "Loading CPU"
|
||||||
|
set -v
|
||||||
|
cat /dev/urandom > /dev/null
|
||||||
|
web_server_scaleup_policy:
|
||||||
|
type: OS::Heat::ScalingPolicy
|
||||||
|
properties:
|
||||||
|
adjustment_type: change_in_capacity
|
||||||
|
auto_scaling_group_id: {get_resource: asg}
|
||||||
|
cooldown: 2
|
||||||
|
scaling_adjustment: 1
|
||||||
|
cpu_alarm_high:
|
||||||
|
type: OS::Ceilometer::GnocchiAggregationByResourcesAlarm
|
||||||
|
properties:
|
||||||
|
description: Scale-up if the mean CPU > 10% on 1 minute
|
||||||
|
metric: cpu_util
|
||||||
|
aggregation_method: mean
|
||||||
|
granularity: 60.0
|
||||||
|
evaluation_periods: 1
|
||||||
|
threshold: 10
|
||||||
|
comparison_operator: gt
|
||||||
|
alarm_actions:
|
||||||
|
- {get_attr: [web_server_scaleup_policy, alarm_url]}
|
||||||
|
resource_type: instance
|
||||||
|
query:
|
||||||
|
str_replace:
|
||||||
|
template: '{"=": {"server_group": "stack_id"}}'
|
||||||
|
params:
|
||||||
|
stack_id: {get_param: "OS::stack_id"}
|
||||||
|
# TODO(sileht): create some other kind of kind alarm just to ensure
|
||||||
|
# heat and aodh API are in sync
|
||||||
|
status: 201
|
||||||
|
|
||||||
|
- name: waiting for stack creation
|
||||||
|
desc: Wait for the second event on the stack resource, it can be a success or failure
|
||||||
|
url: $ENVIRON['HEAT_SERVICE_URL']/stacks/integration_test/events?resource_name=integration_test
|
||||||
|
redirects: true
|
||||||
|
method: GET
|
||||||
|
status: 200
|
||||||
|
poll:
|
||||||
|
count: 300
|
||||||
|
delay: 1
|
||||||
|
response_json_paths:
|
||||||
|
$.events[1].resource_name: integration_test
|
||||||
|
|
||||||
|
- name: control stack status
|
||||||
|
desc: Checks the stack have been created successfully
|
||||||
|
url: $ENVIRON['HEAT_SERVICE_URL']/stacks/integration_test
|
||||||
|
redirects: true
|
||||||
|
method: GET
|
||||||
|
status: 200
|
||||||
|
response_json_paths:
|
||||||
|
$.stack.stack_status: "CREATE_COMPLETE"
|
||||||
|
|
||||||
|
- name: list servers
|
||||||
|
desc: Wait the autoscaling stack grow to three servers
|
||||||
|
url: $ENVIRON['NOVA_SERVICE_URL']/servers/detail
|
||||||
|
method: GET
|
||||||
|
poll:
|
||||||
|
count: 1200
|
||||||
|
delay: 1
|
||||||
|
response_json_paths:
|
||||||
|
$.servers[0].metadata.'metering.server_group': $RESPONSE['$.stack.id']
|
||||||
|
$.servers[1].metadata.'metering.server_group': $RESPONSE['$.stack.id']
|
||||||
|
$.servers[2].metadata.'metering.server_group': $RESPONSE['$.stack.id']
|
||||||
|
$.servers[0].status: ACTIVE
|
||||||
|
$.servers[1].status: ACTIVE
|
||||||
|
$.servers[2].status: ACTIVE
|
||||||
|
|
||||||
|
- name: check gnocchi resources
|
||||||
|
desc: Check the gnocchi resources for this three servers exists
|
||||||
|
url: $ENVIRON['GNOCCHI_SERVICE_URL']/v1/resource/instance
|
||||||
|
method: GET
|
||||||
|
response_strings:
|
||||||
|
- '"id": "$RESPONSE["$.servers[0].id"]"'
|
||||||
|
- '"id": "$RESPONSE["$.servers[1].id"]"'
|
||||||
|
- '"id": "$RESPONSE["$.servers[2].id"]"'
|
||||||
|
|
||||||
|
- name: check alarm
|
||||||
|
desc: Check the aodh alarm and its state
|
||||||
|
url: $ENVIRON['AODH_SERVICE_URL']/v2/alarms
|
||||||
|
method: GET
|
||||||
|
response_strings:
|
||||||
|
- "integration_test-cpu_alarm_high-"
|
||||||
|
response_json_paths:
|
||||||
|
$[0].state: alarm
|
||||||
|
|
||||||
|
- name: get stack location
|
||||||
|
desc: Get the stack location
|
||||||
|
url: $ENVIRON['HEAT_SERVICE_URL']/stacks/integration_test
|
||||||
|
method: GET
|
||||||
|
status: 302
|
||||||
|
|
||||||
|
- name: delete stack
|
||||||
|
desc: Delete the stack
|
||||||
|
url: $LOCATION
|
||||||
|
method: DELETE
|
||||||
|
status: 204
|
||||||
|
|
||||||
|
- name: get deleted stack
|
||||||
|
desc: Check the stack have been deleted
|
||||||
|
url: $ENVIRON['HEAT_SERVICE_URL']/stacks/integration_test
|
||||||
|
redirects: true
|
||||||
|
method: GET
|
||||||
|
poll:
|
||||||
|
count: 240
|
||||||
|
delay: 1
|
||||||
|
status: 404
|
||||||
|
|
||||||
|
- name: list alarms deleted
|
||||||
|
desc: List alarms, no more exist
|
||||||
|
url: $ENVIRON['AODH_SERVICE_URL']/v2/alarms
|
||||||
|
method: GET
|
||||||
|
response_strings:
|
||||||
|
- "[]"
|
||||||
|
|
||||||
|
- name: list servers deleted
|
||||||
|
desc: List servers, no more exists
|
||||||
|
url: $ENVIRON['NOVA_SERVICE_URL']/servers
|
||||||
|
method: GET
|
||||||
|
response_strings:
|
||||||
|
- "[]"
|
40
ceilometer/tests/integration/gabbi/test_gabbi_live.py
Normal file
40
ceilometer/tests/integration/gabbi/test_gabbi_live.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#
|
||||||
|
# Copyright 2015 Red Hat. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
"""A test module to exercise the Gnocchi API with gabbi."""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from gabbi import driver
|
||||||
|
|
||||||
|
|
||||||
|
TESTS_DIR = 'gabbits-live'
|
||||||
|
|
||||||
|
|
||||||
|
def load_tests(loader, tests, pattern):
|
||||||
|
"""Provide a TestSuite to the discovery process."""
|
||||||
|
NEEDED_ENV = ["AODH_SERVICE_URL", "GNOCCHI_SERVICE_URL",
|
||||||
|
"HEAT_SERVICE_URL", "NOVA_SERVICE_URL",
|
||||||
|
"GLANCE_IMAGE_NAME", "ADMIN_TOKEN"]
|
||||||
|
|
||||||
|
for env_variable in NEEDED_ENV:
|
||||||
|
if not os.getenv(env_variable):
|
||||||
|
if os.getenv("GABBI_LIVE_FAIL_IF_NO_TEST"):
|
||||||
|
raise RuntimeError('%s is not set' % env_variable)
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
|
||||||
|
test_dir = os.path.join(os.path.dirname(__file__), TESTS_DIR)
|
||||||
|
return driver.build_tests(test_dir, loader, host="localhost", port=8041)
|
61
ceilometer/tests/integration/hooks/post_test_hook.sh
Executable file
61
ceilometer/tests/integration/hooks/post_test_hook.sh
Executable file
@ -0,0 +1,61 @@
|
|||||||
|
#!/bin/bash -xe
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# This script is executed inside post_test_hook function in devstack gate.
|
||||||
|
|
||||||
|
function generate_testr_results {
|
||||||
|
if [ -f .testrepository/0 ]; then
|
||||||
|
sudo .tox/functional/bin/testr last --subunit > $WORKSPACE/testrepository.subunit
|
||||||
|
sudo mv $WORKSPACE/testrepository.subunit $BASE/logs/testrepository.subunit
|
||||||
|
sudo .tox/functional/bin/python /usr/local/jenkins/slave_scripts/subunit2html.py $BASE/logs/testrepository.subunit $BASE/logs/testr_results.html
|
||||||
|
sudo gzip -9 $BASE/logs/testrepository.subunit
|
||||||
|
sudo gzip -9 $BASE/logs/testr_results.html
|
||||||
|
sudo chown jenkins:jenkins $BASE/logs/testrepository.subunit.gz $BASE/logs/testr_results.html.gz
|
||||||
|
sudo chmod a+r $BASE/logs/testrepository.subunit.gz $BASE/logs/testr_results.html.gz
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# If we're running in the gate find our keystone endpoint to give to
|
||||||
|
# gabbi tests and do a chown. Otherwise the existing environment
|
||||||
|
# should provide URL and TOKEN.
|
||||||
|
if [ -f $BASE/new/devstack ]; then
|
||||||
|
export CEILOMETER_DIR="$BASE/new/ceilometer"
|
||||||
|
JENKINS_USER=jenkins
|
||||||
|
sudo chown -R jenkins:stack $CEILOMETER_DIR
|
||||||
|
source $BASE/new/devstack/openrc admin admin
|
||||||
|
# Go to the ceilometer dir
|
||||||
|
cd $CEILOMETER_DIR
|
||||||
|
fi
|
||||||
|
|
||||||
|
openstack catalog list
|
||||||
|
export AODH_SERVICE_URL=$(openstack catalog show alarming -c endpoints -f value | awk '/publicURL/{print $2}')
|
||||||
|
export GNOCCHI_SERVICE_URL=$(openstack catalog show metric -c endpoints -f value | awk '/publicURL/{print $2}')
|
||||||
|
export HEAT_SERVICE_URL=$(openstack catalog show orchestration -c endpoints -f value | awk '/publicURL/{print $2}')
|
||||||
|
export NOVA_SERVICE_URL=$(openstack catalog show compute -c endpoints -f value | awk '/publicURL/{print $2}')
|
||||||
|
export GLANCE_IMAGE_NAME=$(openstack image list | awk '/ cirros.*uec /{print $4}')
|
||||||
|
export ADMIN_TOKEN=$(openstack token issue -c id -f value)
|
||||||
|
|
||||||
|
# Run tests
|
||||||
|
echo "Running telemetry integration test suite"
|
||||||
|
set +e
|
||||||
|
|
||||||
|
sudo -E -H -u ${JENKINS_USER:-${USER}} tox -eintegration
|
||||||
|
EXIT_CODE=$?
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Collect and parse result
|
||||||
|
if [ -n "$CEILOMETER_DIR" ]; then
|
||||||
|
generate_testr_results
|
||||||
|
fi
|
||||||
|
exit $EXIT_CODE
|
10
tox.ini
10
tox.ini
@ -42,6 +42,16 @@ setenv = VIRTUAL_ENV={envdir}
|
|||||||
commands =
|
commands =
|
||||||
bash -x {toxinidir}/run-functional-tests.sh "{posargs}"
|
bash -x {toxinidir}/run-functional-tests.sh "{posargs}"
|
||||||
|
|
||||||
|
[testenv:integration]
|
||||||
|
setenv = VIRTUAL_ENV={envdir}
|
||||||
|
EVENTLET_NO_GREENDNS=yes
|
||||||
|
OS_TEST_PATH=./ceilometer/tests/integration
|
||||||
|
OS_TEST_TIMEOUT=2400
|
||||||
|
GABBI_LIVE_FAIL_IF_NO_TEST=1
|
||||||
|
passenv = HEAT_* CEILOMETER_* GNOCCHI_* AODH_* GLANCE_* NOVA_* ADMIN_*
|
||||||
|
commands =
|
||||||
|
bash -x {toxinidir}/tools/pretty_tox.sh "{posargs}"
|
||||||
|
|
||||||
[testenv:py34]
|
[testenv:py34]
|
||||||
deps = -r{toxinidir}/requirements.txt
|
deps = -r{toxinidir}/requirements.txt
|
||||||
-r{toxinidir}/test-requirements.txt
|
-r{toxinidir}/test-requirements.txt
|
||||||
|
Loading…
Reference in New Issue
Block a user